【发布时间】: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