如何从这些数据中,我只显示日期 "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 ║╚═════════════════════════╩══════════════╝。
你想要的行是 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中是保留字,因此不是列名的好选择。
如果你只是想要有重叠的行,你可以使用 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
);