【发布时间】:2021-10-03 10:28:12
【问题描述】:
我有一个非常简单的表格如下:
ID NAME PRICE
1 A 10.45
2 B 8.25
3 A 10.45
4 C 5.00
5 D 4.00
6 E 10.45
运行DENSE_RANK()时
select [name], [price],
DENSE_RANK() over (PARTITION BY [name], [price] ORDER BY [name],[price]) as drank
from temp
我得到以下信息。我希望看到第二行应该有drank 2
name price drank
A 10.45 1
A 10.45 1 //this should be 2, isn't
B 8.25 1
C 5.00 1
D 4.00 1
E 10.45 1
【问题讨论】:
-
请解释你要做什么。
-
如果您在同一列上进行分区和排序,那么您做错了。分区子句是分组,顺序是排序。如果 2 相同,则所述组内的顺序是完全任意的。另外,第二行,
NAMEA应该是1,你要求DENSE_RANK;排名函数将相等的值赋予相同的排名(请参阅remarks)。好像你想要ROW_NUMBER。 -
@Larnu - 你很准。当我将
ORDER BY更改为ORDER BY id时,它给了我想要的东西。看来我对dense_rank()的理解不正确。你可以发布你的答案吗? -
在不知道您所追求的实际结果的情况下,我宁愿不这样做。您只告诉我们第二行是错误的,但其他行呢?如果
B有 2 行价格不同会怎样?如果C有 3 行,其中 2 行与price具有相同的值,而另一行具有不同的值怎么办?
标签: sql sql-server window-functions