sql - 消除并减少重叠的日期范围

标签 sql sql-server tsql sql-server-2005 stored-procedures

我有一组日期范围,其中包含部分和完全重叠的日期,如下所示:

UserID  StartDate   EndDate 
======  ==========  ==========
1       2011-01-01  2011-01-02  <- A
1       2011-01-01  2011-01-10  <- A
1       2011-01-08  2011-02-15  <- A
1       2011-02-20  2011-03-10  <- B
2       2011-01-01  2011-01-20  <- C
2       2011-01-15  2011-01-25  <- C

使用 T-SQL,我想为每个用户创建一组新数据,消除重叠数据,扩展范围并在需要时删除冗余数据,结果如下:

UserID  StartDate   EndDate 
======  ==========  ==========
1       2011-01-01  2011-02-15 ('A', three rows combined, extending the range)
1       2011-02-20  2011-03-10 ('B', no change, no overlaps here)
2       2011-01-01  2011-01-25 ('C', two rows combined)

如果需要的话,光标很好,但如果我可以不用它们那就更好了。

最佳答案

对于 SQL Server 2005+

-- sample table with data
declare @t table(UserID int, StartDate datetime, EndDate datetime)
insert @t select
1, '20110101', '20110102' union all select
1, '20110101', '20110110' union all select
1, '20110108', '20110215' union all select
1, '20110220', '20110310' union all select
2, '20110101', '20110120' union all select
2, '20110115', '20110125'

-- your query starts below

select UserID, Min(NewStartDate) StartDate, MAX(enddate) EndDate
from
(
    select *,
        NewStartDate = t.startdate+v.number,
        NewStartDateGroup =
            dateadd(d,
                    1- DENSE_RANK() over (partition by UserID order by t.startdate+v.number),
                    t.startdate+v.number)
    from @t t
    inner join master..spt_values v
      on v.type='P' and v.number <= DATEDIFF(d, startdate, EndDate)
) X
group by UserID, NewStartDateGroup
order by UserID, StartDate

注释:

  1. @t 替换为您的表名称

关于sql - 消除并减少重叠的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213484/

相关文章:

sql - 如何优化以下查询

sql - `PIVOT` 与 `EXISTS`

sql - 合并查询结果中的记录

sql-server - 删除表中的所有行

sql-server - 将 SQL Server 查询的结果复制到 Excel

sql-server - SQL Server IN 子句

sql - 有人可以举例说明 PostgreSQL 9.4 中有序集函数的用例吗?

sql - 使用索引加速连接

sql - 使用连接条件单独从各个表中检索不同计数

php - 在 Magento 1.7.2 中使用 MYSQL 查询插入相同的产品描述