Sql выберите дату сравнения с предыдущей строкой - PullRequest
0 голосов
/ 24 апреля 2020

Как из этих данных я показываю только имена, в которых дата "END" больше, чем следующая дата "Begin".

например, Питер не должен отображаться, поскольку его первая строка "END" 2019-12-31 и его следующая «Начало» Дата 2020-01-01, так что 2019 <2020. Теперь для Джона первая строка «Конец» даты 2021-12-31, которая больше, чем следующая строка «Начало» даты 2020-03-01. </p>


╔═════════╦════════════╦════════════╗
║  name   ║   Begin    ║    End     ║
╠═════════╬════════════╬════════════╣
║ Peter   ║ 2016-01-01 ║ 2019-12-31 ║
║ Peter   ║ 2020-01-01 ║ 2020-12-31 ║
║ John    ║ 2018-01-01 ║ 2021-12-31 ║
║ John    ║ 2020-03-01 ║ 2022-03-01 ║
║ Mary    ║ 2018-02-01 ║ 2022-01-31 ║
║ Mary    ║ 2020-01-01 ║ 2022-01-01 ║
║ Charles ║ 2019-07-01 ║ 2021-06-30 ║
║ Charles ║ 2020-03-01 ║ 2022-03-01 ║
╚═════════╩════════════╩════════════╝

Так что из этих данных, как я могу получить только


╔═════════╦════════════╦════════════╗
║  name   ║   Begin    ║    End     ║
╠═════════╬════════════╬════════════╣
║ John    ║ 2018-01-01 ║ 2021-12-31 ║
║ John    ║ 2020-03-01 ║ 2022-03-01 ║
║ Mary    ║ 2018-02-01 ║ 2022-01-31 ║
║ Mary    ║ 2020-01-01 ║ 2022-01-01 ║
║ Charles ║ 2019-07-01 ║ 2021-06-30 ║
║ Charles ║ 2020-03-01 ║ 2022-03-01 ║
╚═════════╩════════════╩════════════╝

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Вы хотите строки, чья end дата больше, чем следующая begin для того же name Вы можете использовать оконные функции для этого

select t.name, tLbegin, t.end
from (
    select
        t.*,
        lead(t.begin) over(partition by t.name order by t.begin) lead_begin
    from mytable t
) t
where t.end > t.lead_begin or lead_begin is null

Обратите внимание, что это не приведет к удалению второй записи для 'John' (так как у него нет следующей записи).

Примечание: begin и end являются зарезервированными словами в SQL, поэтому не подходят для имен столбцов.

0 голосов
/ 24 апреля 2020

Если вам нужны строки с перекрытиями, вы можете использовать exists:

select t.*
from t
where exists (select 1
              from t t2
              where t2.name = t.name and
                    t2.end > t.start and
                    t2.start < t.start
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...