sql - 在 sql 中选择重复多次的每个 ID 的 end_date >= start_date 行

标签 sql sql-server date window-functions gaps-and-islands

附上数据的图像。在我的表格中,我有 3 列 id开始日期结束日期,以及如下值:

id     start date  end date
-------------------------------
100    2015-01-01  2015-12-31
100    2016-01-10  2018-12-31
200    2015-02-15  2016-03-15
200    2016-03-15  2016-12-31
300    2016-01-01  2016-12-31
400    2017-01-01  2017-12-31
500    2017-02-01  2017-12-31
600    2017-01-15  2017-03-05
600    2017-02-01  2018-12-31

我希望我的输出是

id     start date  end date
--------------------------------
100    2015-01-01  2015-12-31
100    2016-01-10  2018-12-31
200    2015-02-15  2016-12-31
300    2016-01-01  2016-12-31
400    2017-01-01  2017-12-31
500    2017-02-01  2017-12-31
600    2017-01-15  2018-12-31

查询:

select 
    id, *
from 
    dbo.test_sl 
where 
    id in (select id
           from dbo.test_sl 
           where end_date >= start_date 
           group by id)

请帮助我获得我正在寻找的输出。

enter image description here

最佳答案

这是间隙和岛屿问题的一个示例。在本例中,您希望查找同一 id 不重叠的相邻行。这些是团体的开始。组起始数的累加和,提供分组编号,可用于聚合。

在查询中,这看起来像:

select id, min(startdate), max(enddate)
from (select t.*,
             sum(isstart) over (partition by id order by startdate) as grp
      from (select t.*,
                   (case when exists (select 1
                                      from test_sl t2
                                      where t2.id = t.id and
                                            t2.startdate < t.startdate and
                                            t2.enddate >= t.startdate
                                     )
                         then 0 else 1
                     end) as isstart
            from test_sl t
           ) t
      ) t
group by id, grp;

关于sql - 在 sql 中选择重复多次的每个 ID 的 end_date >= start_date 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53806805/

相关文章:

mysql - zend 'telephone.number' Zend_Paginator_Adapter_DbTableSelect 中的未知列 'where clause'

sql - SELECT FOR JSON 输出 float 指数

同一页面上的 Javascript 响应

ios - 计算Swift中两个日期之间的差异

javascript - momentjs 并转换为 unix 给出了错误的日期

sql - PostgreSQL : how to do GROUP BY in this SQL

asp.net - 需要按年份将日期列拆分为多个列

c# - Entity Framework 多对多,有 2 个表

.net - 在 SQL Server 上查询多个数据库

sql-server - 如何使用 SQL Server 中的 'round' 方法将 float 转换为 int?