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 ---- 窗口函数

如何使用 Oracle SQL 将移动窗口添加到 rank()

oracle sql rank函数取排序值

[转]oracle分析函数Rank, Dense_rank, row_number

oracle rank函数怎么用

Oracle排名函数(Rank)实例详解