首页 > 解决方案 > SQL 中的重叠时间范围

问题描述

我的表中有以下行:

客户起点终点
1A 2019-01-01 2019-01-04
1A 2019-01-03 2019-01-06
1A 2019-01-06 2019-01-10
1A 2019-02-01 2019-02-07
2A 2019-03-01 2019-04-05

我需要将表格合并为如下所示:

客户起点终点
1A 2019-01-01 2019-01-10
1A 2019-02-01 2019-02-07
2A 2019-03-01 2019-04-05

我可以在 SQL 中采取哪些步骤来实现这一目标?

标签: sqlsql-servertsql

解决方案


使用DATEPART(MONTH, DATE)and MIN()MAX()聚合窗口函数,您可以达到预期的结果:

SELECT DISTINCT Customer, 
       MIN(Start) OVER (PARTITION BY Customer, StartMonth) AS Start,
       MAX([End]) OVER (PARTITION BY Customer, EndMonth) AS [End]
FROM (
    SELECT *, DATEPART(MONTH, Start) AS StartMonth, DATEPART(MONTH, [End]) AS EndMonth
    FROM TestTable
) Q

请在db<>fiddle上找到工作演示。

使用给定的示例数据执行示例:

DECLARE @TestTable TABLE (Customer VARCHAR(2), Start DATE, [End] DATE);

INSERT INTO @TestTable (Customer, Start, [End]) VALUES
('1A', '2019-01-01', '2019-01-04'),
('1A', '2019-01-03', '2019-01-06'),
('1A', '2019-01-06', '2019-01-10'),
('1A', '2019-02-01', '2019-02-07'),
('2A', '2019-03-01', '2019-04-05');

SELECT DISTINCT Customer, 
       MIN(Start) OVER (PARTITION BY Customer, StartMonth) AS Start,
       MAX([End]) OVER (PARTITION BY Customer, EndMonth) AS [End]
FROM (
    SELECT *, DATEPART(MONTH, Start) AS StartMonth, DATEPART(MONTH, [End]) AS EndMonth
    FROM @TestTable
) Q

推荐阅读