在多个变量上使用RANK的快速帮助

时间:2011-01-17 17:48:09

标签: sql sql-server sql-server-2005 sql-server-2008

我需要一点帮助在SQL Server 2008中为以下内容编写SELECT语句:(示例表)

  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),我需要获取最新日期的行。实际数据组织得不是很好 - 01-2009可能只有1条记录,03-2009可能只有15条记录。

我想我必须使用DENSE RANK,但我不确定。

1 个答案:

答案 0 :(得分:8)

row_number应该足以满足您的需求。

注意:我假设您的Date列是真正的Date或DateTime数据类型,而不是您显示的表单中的字符串。如果该假设是错误的,则需要一些额外的字符串操作来将Date转换为可排序的格式。

;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