Запрос самостоятельного присоединения или cte лучшее решение? - PullRequest
0 голосов
/ 22 января 2020

У меня есть таблица, которая выглядит следующим образом:

userID   |       Date         | Type |
B     2018-01-19 03:14:07   Start
B     2019-06-23 02:11:03   End
V     2017-01-19 03:14:07   Start
V     2019-08-19 02:33:07   End
C     2019-01-20 03:14:07   Start
C     2019-10-19 03:11:07   End
C     2019-05-19 03:33:07   Mid

Если я хочу по идентификатору рассчитать разницу в днях для каждого пользователя, смогу ли я сделать это с помощью cte для фильтрации type = 'Start' и 'End' для каждого CTE с последующим присоединением к ним или само присоединение по идентификатору? где каждая таблица будет отфильтрована по типу?

, так что cte, такой как:

with start as 
(select id, date, 
from table 
where type = 'Start')

with end as 
(select id, date, 
from table 
where type = 'End')

    select s.id, date_diff('day', s.date, e.date) as duration
    from start s
    join end e
    on s.id = e.id

Self join as:

    select s.id, date_diff('day', s.date, e.date) as duration
    from table t 
    join table t2 
    on t.id = t2.id
    where t.type = 'start' and t2.type = 'end'

Будет ли оба правильно давать ожидаемый результат ?

Спасибо

1 Ответ

1 голос
/ 23 января 2020

Слишком долго для комментария, поэтому отправлять как ответ ..

Это не совсем лучший способ сделать это, но в случае, если вы думали, что вы не можете сделать это без использования CTEs, subqueries и joins, вы можете использовать window-functions. Он не заботится о столбце типа, поэтому он будет отлично работать, даже если у вас несколько дат.

select distinct 
            id,
            date_diff('day', min(date) over (partition by id), max(date) over (partition by id)) as duration
from your_table;

DEMO WITH SQL SERVER

...