在SQL中合并具有重叠日期范围的记录

我心涡轮

**编辑:我们当前的服务器是SQL 2008 R2,因此LAG / LEAD函数将不起作用。

我正在尝试在一个表中获取多个数据流,并将它们组合成1个数据流。给定下面的3个数据流,我希望最终结果为1个流,优先选择状态“ on”。递归似乎是最好的选择,但是到目前为止,我没有运气来完成一个查询,该查询可以满足我的需求。

CREATE TABLE #Dates(
    id INT IDENTITY,
    status VARCHAR(4),
    StartDate Datetime,
    EndDate Datetime,
    booth int)

INSERT #Dates
VALUES
( 'off','2015-01-01 08:00','2015-01-01 08:15',1),
( 'on','2015-01-01 08:15','2015-01-01 09:15',1),
( 'off','2015-01-01 08:50','2015-01-01 09:00',2),
( 'on','2015-01-01 09:00','2015-01-01 09:30',2),
( 'off','2015-01-01 09:30','2015-01-01 09:35',2),
( 'on','2015-01-01 09:35','2015-01-01 10:15',2),
( 'off','2015-01-01 09:30','2015-01-01 10:30',3),
( 'on','2015-01-01 10:30','2015-01-01 11:00',3)

status  StartDate   EndDate
---------------------------
off     08:00       08:15
on      08:15       09:15
off     08:50       09:00
on      09:00       09:30
off     09:30       09:35
on      09:35       10:15
off     09:30       10:30
on      10:30       11:00

最终结果:

status  StartDate   EndDate
---------------------------
off     8:00        8:15
on      8:15        9:15
on      9:15        9:30
off     9:30        9:35
on      9:35        10:15
off     10:15       10:30
on      10:30       11:00

本质上,任何时候只要状态为“开”,它都应覆盖所有并发的“关”状态。

Source:
|----off----||---------on---------|
                     |---off--||------on----||---off---||--------on------|
                                             |--------------off------------------||------on------|

Result (Either result would work):
|----off----||----------on--------||---on---||---off---||--------on------||-off--||------on------|
|----off----||----------on------------------||---off---||--------on------||-off--||------on------|
詹姆斯·Z

这是我能够弄清楚的2008年最简单的版本:

; with Data (Date) as (
select StartDate from Dates
union
select EndDate from Dates),

Ranges (StartDate, Status) as (
select D.Date, D2.Status
from Data D
outer apply (
  select top 1 D2.Status
  from Dates D2
  where D2.StartDate <= D.Date and D2.EndDate > D.Date
  order by case when Status = 'on' then 1 else 2 end
) D2)

select R.StartDate,
(select min(D.Date) from Data D where D.Date > R.StartDate) as EndDate,
Status
from Ranges R
order by R.StartDate

即使状态与先前相同,它也会从每个起点/终点开始返回新行。没有找到任何简单的方法来组合它们。

编辑:将第一个CTE更改为此将合并行:

; with Data (Date) as (
select distinct StartDate from Dates D1
where not exists (Select 1 from Dates D2 
    where D2.StartDate < D1.StartDate and D2.EndDate > D1.StartDate and
    Status = 'on')
union
select distinct EndDate from Dates D1
where not exists (Select 1 from Dates D2 
    where D2.StartDate < D1.EndDate and D2.EndDate > D1.EndDate and
    Status = 'on')
),

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在SQL中合并具有重叠日期范围的记录

来自分类Dev

在SQL中查找日期范围重叠的记录

来自分类Dev

MySQL合并具有重叠日期范围的表行

来自分类Dev

在SQL中检测和合并日期范围的连续重叠

来自分类Dev

在postgres中合并日期范围以消除重叠

来自分类Dev

合并记录以重叠日期

来自分类Dev

使用SQL Server中不同记录的开始日期和结束日期创建具有数据范围的临时表

来自分类Dev

合并重叠日期的记录

来自分类Dev

在Oracle SQL中根据重叠的日期范围连接客户端记录

来自分类Dev

SQL Server 2014 合并重叠日期范围

来自分类Dev

如何在MySQL中合并重叠的日期范围?

来自分类Dev

从2个数据帧中获取具有日期范围的非重叠周期

来自分类Dev

合并两个具有重叠范围的数据框并计算按类别分组的重叠

来自分类Dev

SQL:查找具有给定日期范围内每月数据的记录

来自分类Dev

SQL:查找具有给定日期范围内每个月的数据的记录

来自分类Dev

MYSQL合并两个表的视图,这些表在日期范围内具有不同的条目记录数

来自分类Dev

如何合并具有相同列的记录并扩展时间范围?

来自分类Dev

将天气数据与R中具有不同日期范围的记录相结合

来自分类Dev

将天气数据与R中具有不同日期范围的记录相结合

来自分类Dev

在SQL表中合并重叠的日期间隔

来自分类Dev

从具有SQL记录中唯一记录的表中获取最小的日期

来自分类Dev

合并具有相同值的行的日期范围

来自分类Dev

SQL中的重叠日期

来自分类Dev

在PostgreSQL中合并重叠的时间范围

来自分类Dev

在PostgreSQL中合并重叠的时间范围

来自分类Dev

SQL日期范围不包括所有记录

来自分类Dev

将两个具有重叠日期的每日时间序列合并

来自分类Dev

确定输入日期范围是否与现有日期范围重叠

来自分类Dev

确定输入日期范围是否与现有日期范围重叠

Related 相关文章

  1. 1

    在SQL中合并具有重叠日期范围的记录

  2. 2

    在SQL中查找日期范围重叠的记录

  3. 3

    MySQL合并具有重叠日期范围的表行

  4. 4

    在SQL中检测和合并日期范围的连续重叠

  5. 5

    在postgres中合并日期范围以消除重叠

  6. 6

    合并记录以重叠日期

  7. 7

    使用SQL Server中不同记录的开始日期和结束日期创建具有数据范围的临时表

  8. 8

    合并重叠日期的记录

  9. 9

    在Oracle SQL中根据重叠的日期范围连接客户端记录

  10. 10

    SQL Server 2014 合并重叠日期范围

  11. 11

    如何在MySQL中合并重叠的日期范围?

  12. 12

    从2个数据帧中获取具有日期范围的非重叠周期

  13. 13

    合并两个具有重叠范围的数据框并计算按类别分组的重叠

  14. 14

    SQL:查找具有给定日期范围内每月数据的记录

  15. 15

    SQL:查找具有给定日期范围内每个月的数据的记录

  16. 16

    MYSQL合并两个表的视图,这些表在日期范围内具有不同的条目记录数

  17. 17

    如何合并具有相同列的记录并扩展时间范围?

  18. 18

    将天气数据与R中具有不同日期范围的记录相结合

  19. 19

    将天气数据与R中具有不同日期范围的记录相结合

  20. 20

    在SQL表中合并重叠的日期间隔

  21. 21

    从具有SQL记录中唯一记录的表中获取最小的日期

  22. 22

    合并具有相同值的行的日期范围

  23. 23

    SQL中的重叠日期

  24. 24

    在PostgreSQL中合并重叠的时间范围

  25. 25

    在PostgreSQL中合并重叠的时间范围

  26. 26

    SQL日期范围不包括所有记录

  27. 27

    将两个具有重叠日期的每日时间序列合并

  28. 28

    确定输入日期范围是否与现有日期范围重叠

  29. 29

    确定输入日期范围是否与现有日期范围重叠

热门标签

归档