Быстрая помощь по использованию RANK для нескольких переменных - PullRequest
3 голосов
/ 17 января 2011

Мне нужна небольшая помощь в написании инструкции SELECT для следующего в SQL Server 2008: (пример таблицы)

  Date                       ProductID                       Year                       Price   
  01-01-10                   01                              2009                       1.00   
  02-01-10                   01                              2009                       2.00   
  03-01-10                   01                              2010                       3.00   
  04-01-10                   01                              2010                       4.00   
  05-01-10                   01                              2011                       5.00   
  06-01-10                   01                              2011                       6.00   
  01-01-10                   02                              2009                       1.00   
  02-01-10                   02                              2009                       2.00   
  03-01-10                   02                              2010                       3.00   
  04-01-10                   02                              2010                       4.00   
  05-01-10                   02                              2011                       5.00   
  06-01-10                   02                              2011                       6.00   
  01-01-10                   03                              2009                       1.00   
  02-01-10                   03                              2009                       2.00   
  03-01-10                   03                              2010                       3.00   
  04-01-10                   03                              2010                       4.00   
  05-01-10                   03                              2011                       5.00   
  06-01-10                   03                              2011                       6.00   
  01-01-10                   04                              2009                       1.00   
  02-01-10                   04                              2009                       2.00   
  03-01-10                   04                              2010                       3.00   
  04-01-10                   04                              2010                       4.00   
  05-01-10                   04                              2011                       5.00   
  06-01-10                   04                              2011                       6.00   

Для каждой уникальной комбинации ProductID-Year (например, 01-2009, 03-2011) мне нужно взять строку с самой последней датой. Фактические данные не так хорошо организованы - может быть только 1 запись на 01-2009 и 15 записей на 03-2009.

Я думаю, что должен использовать DENSE RANK, но я не уверен.

1 Ответ

8 голосов
/ 17 января 2011

row_number должно быть достаточно для ваших нужд.

Примечание: я предполагаю, что ваш столбец Date - это истинный тип данных Date или DateTime, а не строка в показанной вами форме.Если это предположение неверно, для преобразования даты в сортируемый формат потребуются дополнительные манипуляции со строками.

;with cteRowNumber as (
    select Date, ProductID, Year, Price, 
           row_number() over (partition by ProductID, Year order by Date desc) as RowNum
        from YourTable
)
select Date, ProductID, Year, Price
    from cteRowNumber
    where RowNum = 1
...