2013-08-09 3 views
1

У меня есть список дат в формате YYYYMM и я пытаюсь ранжировать их в год по формату года, который будет выглядеть следующим образом:SQL Ранжирование Даты получить за год Орден

MonthDisplay YearMonth Rank MonthNumber YearNumber 
Aug-2013  201308  1  8   2013 
Aug-2012  201208  2  8   2012 
Jul-2013  201307  3  7   2013 
Jul-2012  201207  4  7   2012 

I удалось получить его закрыть, используя следующий ранг и получить результаты ниже:

RANK() OVER(PARTITION BY 1 ORDER BY MonthNumber DESC, YearNumber DESC) 

Month  YearMonth Rank 
Dec-2012 201212  1  
Dec-2011 201112  2  
Nov-2012 201211  114 
Nov-2011 201111  115 
Oct-2012 201210  227 
Oct-2011 201110  228 

Однако, это начинается с Dec-2012 вместо Aug-2013 (текущий месяц). Я не могу понять, как его начать с текущего месяца. Я уверен, что это нечто очень простое, и я просто пропустил его. Благодаря!

+0

'RANK() OVER (PARTITION BY 1 ORDER BY DESC YearNumber, MonthNumber DESC)' –

+0

Это не соответствует последовательности, указанной в первом примере. Это Звания Aug-2013 как 1 и Aug-2012, как 13. – buzzzzjay

ответ

3
select 
    T.YearMonth, 
    rank() over (order by R.rnk asc, D.YearNumber desc) as [Rank], 
    D.MonthNumber, D.YearNumber 
from Table1 as T 
    outer apply (
     select 
      month(getdate()) as CurMonthNumber, 
      cast(right(T.YearMonth, 2) as int) as MonthNumber, 
      cast(left(T.YearMonth, 4) as int) as YearNumber 
    ) as D 
    outer apply (
     select 
      case 
       when D.MonthNumber <= D.CurMonthNumber then 
        D.CurMonthNumber - D.MonthNumber 
       else 
        12 + D.CurMonthNumber - D.MonthNumber 
      end as rnk  
    ) as R 

sql fiddle Пример

+0

То же, что и выше, но без использования _outer_ _apply_ 'ВЫБОР YYYYMM, RANK() OVER (ORDER BY случае, когда CAST (ПРАВЫЙ (ГГГГММ, 2) AS INT) <= Месяц (getDate()) THEN 12 + CAST (ПРАВИЛЬНЫЙ (ГГГГММ, 2) КАК INT) - Месяц (getDate()) ELSE CAST (ПРАВО (ГГГГММ, 2) КАК INT) - Месяц (getDate ()) КОНЕЦ DESC, CAST (ЛЕВЫЙ (ГГГГММ, 4), как INT) по убыванию) КАК Ранг ОТ DateData' http://sqlfiddle.com/#!3/3c7f4/2 –

+0

Я использую внешней чтобы избежать такого грязного кода, как у вас с миллионами конвертируемых. Вы повторяли CAST (RYYYMM, 2) AS INT) 3 раза в вашем коде и месяц (getDate()) 3 раза. Вы знаете о принципе DRY? –

+1

Да, я согласен. Мне нравится ваше решение намного лучше, чем мое. –

Смежные вопросы