【问题标题】:SQL select that compare date against previous rowSQL 选择将日期与上一行进行比较
【发布时间】:2020-04-24 14:21:17
【问题描述】:

如何从该数据中仅显示日期“END”大于下一个“开始”日期的名称。

例如不应显示彼得,因为他的第一行“结束”日期是 2019 年 12 月 31 日,他的下一个“开始”日期是 2020 年 1 月 1 日,所以 2019 ╔═════════╦════════════╦════════════╗ ║名称║开始║结束║ ╠═════════╬════════════╬════════════╣ ║ 彼得 ║ 2016-01-01 ║ 2019-12-31 ║ ║ 彼得 ║ 2020-01-01 ║ 2020-12-31 ║ ║ 约翰 ║ 2018-01-01 ║ 2021-12-31 ║ ║ 约翰 ║ 2020-03-01 ║ 2022-03-01 ║ ║ 玛丽 ║ 2018-02-01 ║ 2022-01-31 ║ ║ 玛丽 ║ 2020-01-01 ║ 2022-01-01 ║ ║查尔斯║2019-07-01║2021-06-30║ ║ 查尔斯 ║ 2020-03-01 ║ 2022-03-01 ║ ╚═════════╩════════════╩════════════╝

那么我如何从这些数据中得到唯一的

╔═════════╦════════════╦════════════╗ ║名称║开始║结束║ ╠═════════╬════════════╬════════════╣ ║ 约翰 ║ 2018-01-01 ║ 2021-12-31 ║ ║ 约翰 ║ 2020-03-01 ║ 2022-03-01 ║ ║ 玛丽 ║ 2018-02-01 ║ 2022-01-31 ║ ║ 玛丽 ║ 2020-01-01 ║ 2022-01-01 ║ ║查尔斯║2019-07-01║2021-06-30║ ║ 查尔斯 ║ 2020-03-01 ║ 2022-03-01 ║ ╚═════════╩════════════╩════════════╝

【问题讨论】:

  • 可以多于两行吗?

标签: sql sql-server date select


【解决方案1】:

对于相同的name,您需要end 日期大于下一个begin 的行您可以为此使用窗口函数

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 中的保留字,因此列名不是很好的选择。

【讨论】:

    【解决方案2】:

    如果你只想要有重叠的行,你可以使用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
                 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      相关资源
      最近更新 更多