SQL, чтобы найти разницу дат - Oracle - PullRequest
0 голосов
/ 08 июля 2019

У меня есть таблица:

table1

tran_id    user_id    start_date    end_date
1          100        01-04-2018    02-04-2018
2          100        14-06-2018    14-06-2018
4          100        12-06-2018    12-06-2018
7          101        05-01-2018    05-01-2018
9          101        08-01-2018    08-01-2018
3          101        03-01-2018    03-01-2018

Формат даты DD-MM-YYYY

Мне нужно найти разницу в днях, упорядоченную по user_id и start_date. Формула для определения разницы в днях состоит в том, чтобы вычесть end_date из предыдущей записи и start_date из следующей.

Вот ожидаемый результат:

tran_id    user_id    start_date    end_date       day_diff
1          100        01-04-2018    02-04-2018     71
4          100        12-06-2018    12-06-2018     2
2          100        14-06-2018    14-06-2018     0

3          101        03-01-2018    03-01-2018     2
7          101        05-01-2018    05-01-2018     3
9          101        08-01-2018    08-01-2018     0

Как получить это в запросе SQL?

Ответы [ 4 ]

1 голос
/ 08 июля 2019

Используйте функцию lead(), чтобы найти следующее значение, а затем вычесть даты:

select tran_id, user_id, start_date, end_date, nvl(nsd - start_date, 0) diff
  from (
    select t.*, lead(start_date) over (partition by user_id 
                                       order by start_date) nsd 
      from table1 t)

демо

1 голос
/ 08 июля 2019

Вы можете использовать lead() для этого. Поскольку lead() принимает три аргумента, вам не нужен подзапрос или иметь дело со null значениями:

select t.*,
       (lead(start_date, 1, start_date) over (partition by user_id order by start_date) -
        start_date
       ) as diff
from t;
0 голосов
/ 08 июля 2019

Незначительное исправление к ответу, данному Пондером Стиббонсом.Разница выделена в Полужирный .

выберите значение tran_id, user_id, start_date, end_date, nvl (nsd - end_date , 0) diff из (выберите t. *, Lead (start_date) over (разделение по порядку user_id по start_date) nsd из date_test t);

С уважением, Akash

0 голосов
/ 08 июля 2019

Я думаю, что это: Функция DATEDIFF в Oracle в сочетании с функцией LAG должна помочь вам.

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