我有查询输出以下内容,
RegDate Month countrycode affiliate sk_skin AC GameWin 1/1/2011 1/1/2011 DE 0 a 274 32458.2558 1/1/2011 1/1/2011 UK 0 b 4 386.6925 1/1/2011 1/1/2011 FI 1 a 320 12875.0189 1/1/2011 1/1/2011 SK 1 b 85 5752.8503 1/1/2011 1/1/2011 FI 0 a 520 65339.3142 1/1/2011 1/1/2011 FI 1 a 295 29163.1045 1/1/2011 2/1/2011 DE 0 a 79 16028.3849 1/1/2011 3/1/2011 DE 0 b 4 525.252 1/1/2011 3/1/2011 DE 1 a 36 7718.6327 1/1/2011 3/1/2011 DE 1 b 24 5715.1279 1/1/2011 4/1/2011 FI 0 a 196 27357.4072 1/1/2011 4/1/2011 FI 1 a 146 20178.9315
我想有一个月份行号,在这种情况下,1/1/2011将是1,2/1/2011将是2,3/1/2011将是3,4/1/2011将是4.
此查询将在循环中运行,因此月份可以从不同的点开始,
我想要以下输出;
RegDate Month countrycode affiliate sk_skin AC GameWin Month 1/1/2011 1/1/2011 DE 0 a 274 32458.2558 1 1/1/2011 1/1/2011 UK 0 b 4 386.6925 1 1/1/2011 1/1/2011 FI 1 a 320 12875.0189 1 1/1/2011 1/1/2011 SK 1 b 85 5752.8503 1 1/1/2011 1/1/2011 FI 0 a 520 65339.3142 1 1/1/2011 1/1/2011 FI 1 a 295 29163.1045 1 1/1/2011 2/1/2011 DE 0 a 79 16028.3849 2 1/1/2011 3/1/2011 DE 0 b 4 525.252 3 1/1/2011 3/1/2011 DE 1 a 36 7718.6327 3 1/1/2011 3/1/2011 DE 1 b 24 5715.1279 3 1/1/2011 4/1/2011 FI 0 a 196 27357.4072 4 1/1/2011 4/1/2011 FI 1 a 146 20178.9315 4
我试过使用以下内容,
(RANK() OVER (ORDER BY DATEADD(m,DATEDIFF(m,0,date),0))-1) as rank
日期的格式是使用
的日期(没有时间)DATEADD(m,DATEDIFF(m,0,datetime),0)
这个等级给了我随机的排名编号(有一种模式),但是因为这个查询将被添加到一个循环并迭代生成的数量需要,1表示最低月份,2表示第二低等等。 。
我希望我能正确解释自己。
答案 0 :(得分:2)
根据DENSE_RANK
DATEPART
DENSE_RANK() OVER ( ORDER BY DATEPART(m, MyDate) )
当您需要跨越多年时,只需添加另一个日期部分
DENSE_RANK() OVER ( ORDER BY DATEPART(YYYY, MyDate), DATEPART(m, MyDate))
示例
DECLARE @table TABLE ( MyDate DATE )
INSERT INTO @table
VALUES ( '02/01/2012' )
, ( '02/01/2012' )
, ( '02/01/2012' )
, ( '03/01/2012' )
, ( '03/01/2012' )
, ( '03/01/2012' )
, ( '04/01/2012' )
SELECT *
,DENSE_RANK() OVER ( ORDER BY DATEPART(m, MyDate) )
FROM @table
结果
Month Rank
2012-02-01 1
2012-02-01 1
2012-02-01 1
2012-03-01 2
2012-03-01 2
2012-03-01 2
2012-04-01 3
答案 1 :(得分:1)
使用DENSE_RANK()而不是RANK(),它将产生所需的编号。