【问题标题】:ORACLE how to use RANK functionORACLE如何使用RANK函数
【发布时间】: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 中的列(或更一般的表达式)进行排序永远不会有意义。在给定的分区中,该表达式将是常量,因此它不会以任何方式对 分区 进行排序。在尝试任何其他方法之前,请先考虑这一点,并弄清楚您真正需要查询做什么。

标签: sql oracle window-functions


【解决方案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。
猜你喜欢
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
相关资源
最近更新 更多