如何强制rank函数为等级的行分配不同的值?

时间:2015-05-13 21:18:04

标签: sql sql-server

我的数据库中有一个与此类似的表

ID    Year    Quarter    .....
1     2000    3
2     2002    4     
1     2003    3
1     2000    3

数据库的关键是ID,年份和季度的组合。我需要获取每个ID的最新条目,所以我使用了像这样的排名函数:

select ID
from
(
select ID, Year, Quarter
RANK() OVER (PARTITION BY ID ORDER BY Year + Quarter) as rank
from myTable
) tmp
where rank = 1

数据库中可能存在具有相同ID,年份和季度的条目。我需要能够选择其中一个而不选择其中一个。我并不特别在乎哪一个,只不过一个。我一直在阅读MSDN页面,我似乎无法找到我要找的东西。有人有主意吗?谢谢。

1 个答案:

答案 0 :(得分:4)

有三种基本选项 - 在这种情况下,正如其他人所说,您应该使用Row_number()

Value  Row_Number  Rank  Dense_Rank
A      1           1     1
A      2           1     1
B      3           3     2
D      4           4     3
E      5           5     4

基本上,Row_number会为行分配一个数字,并且不会复制或跳过值(除非您使用的是分区)。 Rank允许绑定,如果前一个值存在平局,则跳过值。 Dense_Rank允许绑定,不跳过值。