【发布时间】:2019-05-07 08:31:39
【问题描述】:
我有一个格式如下的表格
Id StartDate EndDate Type
1 2012-02-18 2012-03-18 1
1 2012-03-17 2012-06-29 1
1 2012-06-27 2012-09-27 1
1 2014-08-23 2014-09-24 3
1 2014-09-23 2014-10-24 3
1 2014-10-23 2014-11-24 3
2 2015-07-04 2015-08-06 1
2 2015-08-04 2015-09-06 1
3 2013-11-01 2013-12-01 0
3 2018-01-09 2018-02-09 0
我在这里发现了类似的问题,但不能帮助我解决问题。我想合并具有相同Id、Type 和重叠日期期间的行。
上表的结果应该是
Id StartDate EndDate Type
1 2012-02-18 2012-09-27 1
1 2014-08-23 2014-11-24 3
2 2015-07-04 2015-09-06 1
3 2013-11-01 2013-12-01 0
3 2018-01-09 2018-02-09 0
在另一台服务器上,我可以通过以下限制和以下查询来做到这一点:
- 不关心
Type列,只关心Id - 有较新版本的 SQL Server (2012),但现在我有 2008,但代码不兼容
SELECT Id
, MIN(StartDate) AS StartDate
, MAX(EndDate) AS EndDate
FROM (
SELECT *
, SUM(CASE WHEN a.EndDate = a.StartDate THEN 0
ELSE 1
END
) OVER (ORDER BY Id, StartDate) sm
FROM (
SELECT Id
, StartDate
, EndDate
, LAG(EndDate, 1, NULL) OVER (PARTITION BY Id ORDER BY Id, EndDate) EndDate
FROM #temptable
) a
) b
GROUP BY Id, sm
任何建议,我该怎么做
- 在进程中包含类型
- 让它在 SQL Server 2008 上运行
【问题讨论】:
-
Id=3..使用什么逻辑? -
很抱歉。写问题时犯了一个错误。我修好了
-
您所有的行都有 14 天的间隔。如果少于 14 天的间隔,那么 OP 的样子..?例如:
1 2014-10-23 2014-10-24 3 -
它只需要日期的最小值和最大值。正如 14 天是日期期间的实际部分一样。
-
我认为这与我的问题相似。我有与您相同的列,但我继续使用
ROW_NUMBER()和PARTITION BY从我的两个起始日期间隔列中为“连续范围”、“new_period”、“new_period_starting_id”等创建一些额外的帮助列。这是my approach and solution。不幸的是,我没有完整的代码了,但这是我的方法。
标签: sql sql-server tsql sql-server-2008