#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;