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

如何从这些数据中,我只显示日期 “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' 因为它没有下一个记录)。

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

给TA打赏
共{{data.count}}人
人已打赏
未分类

基于元素值的Laravel过滤器数组

2022-9-9 6:47:19

未分类

调整对象的结果Javascript [重复]。

2022-9-9 6:47:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索