1

我有一个表 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 对数据进行了分区,但我无法了解两个不同的记录如何在以下情况下获得相同的排名DENSE_RANK()

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().

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

4

1 回答 1

3

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

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

Row_number无论分区中order by列的唯一性如何,都会为分区中的每一行返回不同的数字。如果按值排序不是唯一的,row_number将返回一个任意数字。

请参阅 SQL Fiddle 上的现场演示。

于 2019-11-07T15:22:56.643 回答