Найдите дату в определенной группе, которая находится рядом с текущей группой, избегая нежелательных групп

#sql #oracle

#sql #Oracle

Вопрос:

Предположим, что таблица называется t1:

 create table t1(
    dates date,
    groups number
);

insert into t1 values('01.03.2020', 1);
insert into t1 values('02.03.2020', 2);
insert into t1 values('10.03.2020', 3);
insert into t1 values('01.04.2020', 10);
insert into t1 values('02.04.2020', 20);
insert into t1 values('10.04.2020', 3);

DATES       GROUPS
01.03.2020  1
02.03.2020  2
10.03.2020  3
01.04.2020  10
02.04.2020  20
10.04.2020  3
  

Мне нужно добавить столбец, в котором будет храниться значение из столбца DATES, где значение столбца GROUP равно 3, и это должна быть дата ближайшей 3D-группы по времени.

Желаемый результат:

 DATES       GROUPS  DATE_OF_NEXT_3D_GROUP
01.03.2020  1       10.03.2020
02.03.2020  2       10.03.2020
10.03.2020  3       NULL(or could be 10.04.2020 from next 3d group)
01.04.2020  10      10.04.2020
02.04.2020  20      10.04.2020
10.04.2020  3       NULL(or date from next 3d group)
...         ...     ...
  

Ценю вашу помощь

Ответ №1:

Я настоятельно рекомендую использовать для этого аналитические функции, а не коррелированный подзапрос:

 select dates, groups,
       (case when groups <> 3
             then min(case when groups = 3 then dates end) over (order by dates desc)
        end)
from t1
order by 1;
  

Аналитические функции предназначены для этого типа операций и должны иметь гораздо лучшую производительность.

Здесь находится db<>fiddle.

Ответ №2:

Вы можете достичь этого с помощью подзапроса:

 select dates,
       groups,
       (select min(dates)
          from t1 b
         where b.groups = 3
           and b.dates > a.dates) as next_g3_date
  from t1 a;