k**g 发帖数: 1558 | 1 建立一个自己的procedure用来rank不同table里面的数据
Create Procedure ASCRanking
@variable varchar(20),
@Rnk_variable varchar(20),
@tablename varchar(50),
@numberofcategory varchar(5),
@Partition varchar(50)
As
Declare @sql1 varchar(200)
Declare @sql2 varchar(200)
BEGIN
set @sql1='Alter Table '+@tablename+'Add '+@Rnk_variable+' real'
EXEC(@sql1)
--set @sql2='Update '+@tablename+
--' Set '+@Rnk_variable+'=NTILE('+@numberofcategory+') OVER(PARTITION BY '+@
Partition+' ORDER BY '+@variable+' ASC)'
--EXEC(@sql2)
END
在运行的时候
Exec ASCRanking
@variable='PB',
@Rnk_variable='Rnk_PB1',
@tablename='#Temp1',
@numberofcategory='100',
@Partition='Date,Region'
出现的错误信息是
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Rnk_PB1'.
大家看看怎么解决这个问题?谢谢! |
g***l 发帖数: 18555 | 2 为什么不把TABLE COMBINE在一起再RANK么,RANK本来就是个FUNCTION,你那个ALTER
TABLE看着就吓人 |
k**g 发帖数: 1558 | 3 因为我要rank 100个variable,如果一起rank的话,花时间远比100*单个rank的长。所
以想写个stored procedure.
包子以发! |
g***l 发帖数: 18555 | 4 我还是没搞懂你想干什么,什么叫rank不同table里面的数据,你举个列子好不好,我
觉得你这个SP本身问题就很大,你有多少TABLE要RANK,RANK完了放在哪里?总不能就
扔在MANAGEMENT STUDIO里再COPY出来吧。为什么不能COMBINE呢
无非是这样么,RANK然后GROUP BY TABLENAME不就行了,这样就避免了有多少TABLE,
RANK出来放在哪里的问题。
TABLENAME DATA RANK
TABLE1 XXXX RANK
TABLE1 XXXX2 RANK
TABLE2 XXXX RANK
TABLE2 XXXX2 RANK |
k**g 发帖数: 1558 | 5 我要rank table1里的100 variables,结果存在table1里面,
接下来要rank table2里的同样的variables,结果存在table2里面,依次类推。。。
【在 g***l 的大作中提到】 : 我还是没搞懂你想干什么,什么叫rank不同table里面的数据,你举个列子好不好,我 : 觉得你这个SP本身问题就很大,你有多少TABLE要RANK,RANK完了放在哪里?总不能就 : 扔在MANAGEMENT STUDIO里再COPY出来吧。为什么不能COMBINE呢 : 无非是这样么,RANK然后GROUP BY TABLENAME不就行了,这样就避免了有多少TABLE, : RANK出来放在哪里的问题。 : TABLENAME DATA RANK : TABLE1 XXXX RANK : TABLE1 XXXX2 RANK : TABLE2 XXXX RANK : TABLE2 XXXX2 RANK
|
g***l 发帖数: 18555 | 6 那不就是个TABLE UPDATE的问题么?TABLE里没有RANK COLUMN给你吧,你如果还要去
ALTER TABLE的话,那你这个SP就很外行了,原则是不让你改TABLE,你弄个TEMP TABLE
,RANK完一个放进去,TABLENAME也做成个COLUMN,然后RANK第二个再放进去,最后一次
性显示出来。如果你去ALTER TABLE的话,RUN两次在同一个TABLE加同样的COLUMN当然
会出错,这种做法也很不专业。
【在 k**g 的大作中提到】 : 我要rank table1里的100 variables,结果存在table1里面, : 接下来要rank table2里的同样的variables,结果存在table2里面,依次类推。。。
|
k**g 发帖数: 1558 | 7 但是我在SP里面先Alter Table '+@tablename+' Add '+@Rnk_variable+' real',然后
再update那个@Rnk_variable的column,和你说的没有什么差别吧?
TABLE
【在 g***l 的大作中提到】 : 那不就是个TABLE UPDATE的问题么?TABLE里没有RANK COLUMN给你吧,你如果还要去 : ALTER TABLE的话,那你这个SP就很外行了,原则是不让你改TABLE,你弄个TEMP TABLE : ,RANK完一个放进去,TABLENAME也做成个COLUMN,然后RANK第二个再放进去,最后一次 : 性显示出来。如果你去ALTER TABLE的话,RUN两次在同一个TABLE加同样的COLUMN当然 : 会出错,这种做法也很不专业。
|
g***l 发帖数: 18555 | 8 PRODUCTION的TABLE你怎么可能随意乱改呢,SP的PERMISSION一般不允许ALTER TABLE,
这种野鸡SP在公司会让人笑话死的,你的思路要变一变。
【在 k**g 的大作中提到】 : 但是我在SP里面先Alter Table '+@tablename+' Add '+@Rnk_variable+' real',然后 : 再update那个@Rnk_variable的column,和你说的没有什么差别吧? : : TABLE
|
k**g 发帖数: 1558 | 9 问题是这个不是production的table,我的SP的Permission可以alter table, 只是
update table的时候出错。你知道我的syntax错在哪里了吗?
我承认我们公司的sql就是野鸡,但是只要让我完成这个rank就行了,我们也没有复杂
的数据库。
【在 g***l 的大作中提到】 : PRODUCTION的TABLE你怎么可能随意乱改呢,SP的PERMISSION一般不允许ALTER TABLE, : 这种野鸡SP在公司会让人笑话死的,你的思路要变一变。
|
g***l 发帖数: 18555 | 10 因为 UPDATE SET STH=RANK就不行,RANK本来就要对TABLE进行排序,必须放在一个
TEMP TABLE里再JOIN回来 |
|
|
g***l 发帖数: 18555 | 11 应该还有一个JOIN,看我的列子
Once the RANKING column contains the correct values, we can slide the
values into column B, then drop the RANKING column.
ALTER TABLE
TEST
ADD (
RANKING NUMBER);
Putting the values into the RANKING column is a bit challenging, unless
we use inline views:
UPDATE
TEST T1
SET
RANKING=(
SELECT
RANKING
FROM
(SELECT
A,
B,
RANK() OVER (ORDER BY A,B) RANKING
FROM
TEST) T2
WHERE
T1.A=T2.A
AND T1.B=T2.B); |
k**g 发帖数: 1558 | 12 明白了,谢谢!再给个包子。
顺便问问,怎么写个winsorize的query,就是5 percentile以下的用5 percentile的值
,超过95 percentile的用95 percentile的值? |
g***l 发帖数: 18555 | 13 winsorize这个不会,这不是统计学里的东西么,EXCEL或者SAS,SQL不做统计,需要另
外的TOOL |
i****a 发帖数: 36252 | 14 Print @sql
And the try to execute that. You'll see where the error is.
[发表自未名空间手机版 - m.mitbbs.com]
【在 k**g 的大作中提到】 : 建立一个自己的procedure用来rank不同table里面的数据 : Create Procedure ASCRanking : @variable varchar(20), : @Rnk_variable varchar(20), : @tablename varchar(50), : @numberofcategory varchar(5), : @Partition varchar(50) : As : Declare @sql1 varchar(200) : Declare @sql2 varchar(200)
|
k********e 发帖数: 702 | 15 你在数据那里用case when xxx<=5 then 5 else 95 end 这种if语句不就行了么
【在 k**g 的大作中提到】 : 明白了,谢谢!再给个包子。 : 顺便问问,怎么写个winsorize的query,就是5 percentile以下的用5 percentile的值 : ,超过95 percentile的用95 percentile的值?
|
g***l 发帖数: 18555 | 16 要先RANK一下吧,然后RANK*100/TOTAL COUNT
【在 k********e 的大作中提到】 : 你在数据那里用case when xxx<=5 then 5 else 95 end 这种if语句不就行了么
|
k**g 发帖数: 1558 | 17 因为有数据是一样的,所以应该用row number*100/total row number, 找出5和95
percentile,然后winsorize <5% and >95%
【在 g***l 的大作中提到】 : 要先RANK一下吧,然后RANK*100/TOTAL COUNT
|
k********e 发帖数: 702 | 18 是不是啊?
嫩的头像很诱人啊
【在 g***l 的大作中提到】 : 要先RANK一下吧,然后RANK*100/TOTAL COUNT
|
k**g 发帖数: 1558 | 19 我用了这个例子,结果rank一个variable,花了33分钟。如果我用以下的只要花10秒,
问题是我有90个variable,如果用以下的然后再join 90个temp table,也要花很长时间
。有什么省时间的方法啊?
select *,
NTILE(100) OVER(PARTITION BY Date,Region ORDER BY PB ASC) AS Rnk_PB2
into #Temp2
From #temp1
【在 g***l 的大作中提到】 : 应该还有一个JOIN,看我的列子 : Once the RANKING column contains the correct values, we can slide the : values into column B, then drop the RANKING column. : ALTER TABLE : TEST : ADD ( : RANKING NUMBER); : Putting the values into the RANKING column is a bit challenging, unless : we use inline views: : UPDATE
|
g***l 发帖数: 18555 | 20 你一个TABLE里有多少数据啊,有INDEX么?
,
【在 k**g 的大作中提到】 : 我用了这个例子,结果rank一个variable,花了33分钟。如果我用以下的只要花10秒, : 问题是我有90个variable,如果用以下的然后再join 90个temp table,也要花很长时间 : 。有什么省时间的方法啊? : select *, : NTILE(100) OVER(PARTITION BY Date,Region ORDER BY PB ASC) AS Rnk_PB2 : into #Temp2 : From #temp1
|
k**g 发帖数: 1558 | 21 有阿, 1.6 million row的数据,200个column
【在 g***l 的大作中提到】 : 你一个TABLE里有多少数据啊,有INDEX么? : : ,
|