【问题标题】:Why is dense_rank() function assigning same rank to different records?为什么dense_rank() 函数将相同的等级分配给不同的记录?
【发布时间】:2020-03-04 04:53:54
【问题描述】:

我有一个表格TAB,其结构如下:

create table TAB (
    TRAIN_NUMBER varchar2(5),
    TRAIN_START_DATE date,
    EVENT_CODE varchar2(2),
   INTERCHANGE_FLAG number
)

我在其中插入了 2 条记录

Insert into TAB Values('12987','04-Nov-2019','HO',1);
Insert into TAB Values('12987','04-Nov-2019','TO',1);

我只想要输出中排名为 1 的一行,因此我已经根据 Train No 和 TRAIN_START_DATE 对数据进行了分区,但我无法理解在 @ 的情况下两个不同的记录如何获得相同的排名987654323@?

SELECT TRAIN_NUMBER, TRAIN_START_DATE , EVENT_CODE 
FROM (
  SELECT TRAIN_NUMBER, TRAIN_START_DATE, EVENT_CODE, 
         DENSE_RANK() OVER (PARTITION  BY TRAIN_NUMBER, TRAIN_START_DATE ORDER BY INTERCHANGE_FLAG) my_rank 
  FROM TAB
) 
WHERE  my_rank = 1;

我得到的输出为

TRAIN_NUMBER    TRAIN_START_DATE    EVENT_CODE
  12987           04-NOV-19           HO
  12987           04-NOV-19           TO

我只想要一行 my_rank=1 并且为此我使用了DENSE_RANK()

我应该在查询中应用什么以便只获得一条记录?

【问题讨论】:

  • 两行都有相同的 train_number 和 start date 和 contrast_flag,所以很明显他们会得到相同的排名。您的查询应该选择这两者中的哪一个?
  • 但是dense_Rank()返回不同的rank,rank()返回相同的
  • 使用row_number()是你只想要一行。 rank()dense_rank() 可以返回重复项。
  • 是的,根据定义 DENSE_RANK()RANK() 可以为不同的行返回相同的数字。
  • 那么如果他们为不同的行返回相同的数字,那么两者之间有什么区别

标签: sql oracle11g oracle12c window-functions dense-rank


【解决方案1】:

Dense_rankrank 将返回相同的数字,只要其 order by 子句中的值保持不变。

dense_rankrank 之间的区别在于,一旦 order by 子句中的值发生变化,dense_rank 将返回下一个连续数字,而 rank 将返回一个基于行号的数字.

Row_number 将为分区中的每一行返回不同的数字,而不管分区中order by 列的唯一性如何。 如果值的顺序不是唯一的,row_number 将返回一个任意数字。

See a live demo on SQL Fiddle.

【讨论】:

  • 请记住,在平局的情况下,row_number 不是确定性的。
  • @Andrew 这绝对正确。我应该提到它。
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2018-01-16
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多