Каков наилучший способ обойти данные? - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь отобразить данные следующим образом:
В нашей базе данных есть события (с уникальным идентификатором), а затем дата начала. События не перекрываются, и каждое начинается с даты окончания последнего. Однако у нас нет «даты окончания» в базе данных.
Я должен передать данные в другую систему, чтобы они отображали идентификатор события, дату начала и дату окончания (это просто следующая дата начала).

Я хочу избегать создания пользовательского представления, так как это действительно осуждается здесь для этой базы данных. Поэтому мне интересно, есть ли хороший способ сделать это в запросе.

По сути это будет:
EventA | Дата1 | Дата2
EventB | Дата2 | Date3
EventC | Дата3 | Дата4

События планируются на несколько лет вперед, и мне нужно всего лишь выделить несколько следующих месяцев для запроса, поэтому не беспокойтесь об истечении «дат начала следующего события», и в случае, если это имеет значение, этот запрос будет частью вызов веб-службы.

Основной псевдокод для события и даты:

select Event.ID, Event.StartDate
from Event
where Event.StartDate > sysdate and Event.StartDate < sysdate+90

По сути, я хочу взять Event.StartDate следующего ряда и сделать его Event.EndDate * текущего ряда

1 Ответ

0 голосов
/ 21 июня 2019

Используйте аналитическую функцию 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 | <em>null</em>     

db <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...