Почему функция density_rank () присваивает один и тот же ранг различным записям? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть таблица 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().

Что я должен применить в запросе, чтобы получить только одну запись?

1 Ответ

0 голосов
/ 07 ноября 2019

Dense_rank и rank будут возвращать одно и то же число, если значение в его предложении order by остается неизменным.

Разница между dense_rank и rank заключается в том, что послезначение в предложении order by изменится, dense_rank вернет следующий последовательный номер, а rank вернет число, основанное на номере строки.

Row_number вернет различное число для каждогострока в разделе, независимо от уникальности столбца order by в разделе. Если порядок по значениям не уникален, row_number вернет произвольное число.

См. Живую демонстрацию по SQL Fiddle.

...