Sql选择,比较日期和前一行

问题描述 投票:0回答:1

如何从这些数据中,我只显示日期 "END "大于下一个 "Begin "日期的名字。

例如:Peter不应该被显示,因为他的第一行 "END "日期是2019-12-31,而他的下一行 "Begin "日期是2020-01-01,所以2019<2020。现在John的第一行 "结束 "日期是2021-12-31,比下一行 "开始 "日期2020-03-01大。

╔═════════════════════════════════════════════════╗║姓名║开始║结束║╠═══════════════╬═══════════════════════════╣彼得║2016-01-01║2019-12-31║彼得║2020-01-01║2020-12-31║约翰║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 ║╚═══════════╩ ║ 2022-03-01 ║╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════率

那么,从这些数据中,我如何才能得到只有

╔═══════════════════════════════╗║姓名 ║开始 ║结束 ║╠══════════════╬═════════════════════╣╤╥╦╧ 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 ║╚═════════════════════════╩══════════════╝。
sql select ssms
1个回答
1
投票

你想要的行是 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' 因为它没有下一个记录)。

侧面说明。beginend 在SQL中是保留字,因此不是列名的好选择。


0
投票

如果你只是想要有重叠的行,你可以使用 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
             );
© www.soinside.com 2019 - 2024. All rights reserved.