sql - 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 中采取哪些步骤来实现这一目标?
解决方案
使用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
推荐阅读
- python - 将 +/- 运算符的值作为前缀返回,而在类对象上没有要添加或减去的实际值?
- linux - LINUX FIFO 命名管道 (IPC) 将相邻消息连接在一起
- security - 有没有人遇到过这样的事情
- c# - 如何从字符串中删除最后一个字符
- fonts - 如何在 C# 输出的同一行中返回字符串和 int 变量?
- amazon-ec2 - 使用 ansible playbook 在 Ubuntu 上创建目录
- php - 无法解决“..中的数组到字符串转换”
- performance - 使用线程组计数自动划分 csv 文件的 Shell 脚本
- markdown - 在 Svelte Native 中使用 Markdown?
- javascript - 在css中设置主要内容相对于响应式侧边栏宽度的边距