SQL SERVER - номер ранга/строки по месяцам

У меня есть запрос, который выводит следующее:

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

Я хотел бы иметь номер строки месяца, в этом случае 01.01.2011 будет 1, 01.02.2011 будет 2, 01.03.2011 будет 3, 01.04.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 для второго самого низкого т. д.

Надеюсь, я объяснил себя правильно.


person aborg88    schedule 04.04.2014    source источник


Ответы (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
person Community    schedule 04.04.2014
comment
спасибо :) с помощью этого плюс предложение плотное_ранг сверху сработало! - person aborg88; 04.04.2014
comment
Привет, Когда я охватываю несколько лет, это не работает! - person aborg88; 04.04.2014

Используйте DENSE_RANK() вместо RANK(), это даст желаемую нумерацию.

person dean    schedule 04.04.2014
comment
спасибо :) используя это + предложение datepart ниже сработало :) - person aborg88; 04.04.2014
comment
DATEPART() не будет работать в течение многих лет, например, он вернет 4 для обоих 4.4.2014. и 4.4.2015. Я бы придерживался вашей оригинальной формулы. - person dean; 04.04.2014