SQL SERVER - 按行/月排列的行数

时间:2014-04-04 12:19:08

标签: sql sql-server date rank

我有查询输出以下内容,

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表示第二低等等。 。

我希望我能正确解释自己。

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(),它将产生所需的编号。