ORACLE如何使用RANK函数
Posted
技术标签:
【中文标题】ORACLE如何使用RANK函数【英文标题】:ORACLE how to use RANK function 【发布时间】:2018-10-25 15:32:41 【问题描述】:早安,
我现在无法得到我想要的结果。
例如我的代码是
select
a.donor_id AS ID
, a.date_of_record
, RANK() OVER (PARTITION BY a.donor_id,a.date_of_record ORDER BY date_of_record) r_nk
from table a
结果是
ID ----------------Date_of_record-----r_nk
012 12/14/2017 1
012 12/20/2017 1
012 12/20/2017 1
不过我想这样展示
ID ----------------Date_of_record-----r_nk
012 12/14/2017 1
012 12/20/2017 1
012 12/20/2017 2
我不确定为什么上面的代码不起作用,
非常感谢!!!
【问题讨论】:
您如何知道 12/20/2017 的哪一行应该排在第一位?从技术上讲,他们是平局,所以他们都是第一名。 亲爱的@SQLChao,开枪,你是对的!!!!!!我应该使用 row_number!!!! @supercooldjkazu - 你仍然可以使用rank()
,但前提是你有另一列可以用来打破平局。 row_number()
也确实如此 - 在没有明确的平局休息的情况下也可以使用,但结果将是不确定的。 (这对于结果集中的那三列并不重要,但无论如何排名并不能告诉你太多......)
对于 any 分析函数,按同样包含在 partition by
中的列(或更一般的表达式)进行排序永远不会有意义。在给定的分区中,该表达式将是常量,因此它不会以任何方式对 分区 进行排序。在尝试任何其他方法之前,请先考虑这一点,并弄清楚您真正需要查询做什么。
【参考方案1】:
您也可以使用ROW_NUMBER()
,这样每一行都有一个唯一的值。
select
a.donor_id AS ID
, a.date_of_record
, ROW_NUMBER() OVER (PARTITION BY a.donor_id,a.date_of_record ORDER BY date_of_record) r_nk
from table a
【讨论】:
与 OP 相同的错误:按已包含在PARTITION BY
中的列排序永远不会有意义。只要您这样做,分区就不会以任何方式排序 - 该列的值在分区中是 CONSTANT。以上是关于ORACLE如何使用RANK函数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Oracle SQL 将移动窗口添加到 rank()