Я пытаюсь отобразить данные как таковые:
В нашей базе данных есть события (с уникальным идентификатором), а затем дата начала. События не пересекаются, и каждое из них начинается с даты окончания предыдущего. Однако у нас нет «даты окончания» в базе данных.
Мне нужно передать данные в другую систему, чтобы она показывала идентификатор события, дату начала и дату окончания (это просто следующая дата начала).
Я хочу избежать создания пользовательского представления, так как это действительно осуждается здесь для этой базы данных. Поэтому мне интересно, есть ли хороший способ сделать это в запросе.
По сути это будет:
СобытиеА | Дата1 | Дата2
СобытиеB | Дата2 | Дата3
СобытиеC | Дата3 | Дата4
Мероприятия запланированы на несколько лет вперед, и мне нужно получить запрос только на следующие несколько месяцев, поэтому не беспокойтесь об исчерпании «дат начала следующего события», и, если это имеет значение, этот запрос будет частью вызова веб-сервиса. .
Базовый псевдокод для события и даты будет таким:
select Event.ID, Event.StartDate
from Event
where Event.StartDate > sysdate and Event.StartDate < sysdate+90
По сути, я хочу взять следующую строку Event.StartDate и сделать ее текущей строкой Event.EndDate.
Используйте аналитическую функцию LEAD
:
Настройка Oracle:
Таблица с 10 строками:
CREATE TABLE Event ( ID, StartDate ) AS
SELECT LEVEL, TRUNC( SYSDATE ) + LEVEL
FROM DUAL
CONNECT BY LEVEL <= 10;
Запрос:
select ID,
StartDate,
LEAD( StartDate ) OVER ( ORDER BY StartDate ) AS EndDate
from Event
where StartDate > sysdate and StartDate < sysdate+90
Выход:
ID | STARTDATE | ENDDATE -: | :-------- | :-------- 1 | 22-JUN-19 | 23-JUN-19 2 | 23-JUN-19 | 24-JUN-19 3 | 24-JUN-19 | 25-JUN-19 4 | 25-JUN-19 | 26-JUN-19 5 | 26-JUN-19 | 27-JUN-19 6 | 27-JUN-19 | 28-JUN-19 7 | 28-JUN-19 | 29-JUN-19 8 | 29-JUN-19 | 30-JUN-19 9 | 30-JUN-19 | 01-JUL-19 10 | 01-JUL-19 | null
дб <> рабочий пример здесь
Вау, это просто и элегантно. Понятия не имел ни о «лиде», ни о том, как его искать. Спасибо!