34,588
社区成员
发帖
与我相关
我的任务
分享
WITH a
AS
(
SELECT [name],[start_date]
FROM #T1 AS a
WHERE NOT EXISTS ( SELECT 1
FROM #T1 AS b
WHERE [name] = a.[name]
AND end_date =a.[start_date])
),b AS
(
SELECT [name],[end_date]
FROM #T1 AS a
WHERE NOT EXISTS ( SELECT 1
FROM #T1 AS b
WHERE [name] = a.[name]
AND [start_date] =a.[end_date])
)
SELECT a.[name]
,a.[start_date]
,[end_date] = MIN(b.[end_date])
FROM a
INNER JOIN b ON a.[name] = b.[name] AND a.[start_date]<=b.[end_date]
GROUP BY a.[name]
,a.[start_date]
/*
name start_date end_date
A 2014-01-01 00:00:00.000 2014-06-06 00:00:00.000
B 2014-01-01 00:00:00.000 2014-03-03 00:00:00.000
B 2014-05-05 00:00:00.000 2014-07-07 00:00:00.000
*/
use Tempdb
go
--> -->
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([name] nvarchar(1),[start_date] Datetime,[end_date] Datetime)
Insert #T1
select N'A','2014.1.1','2014.3.3' union all
select N'A','2014.5.5','2014.6.6' union all
select N'A','2014.3.3','2014.5.5' union all
select N'B','2014.1.1','2014.3.3' union all
select N'B','2014.5.5','2014.6.6' union all
select N'B','2014.6.6','2014.7.7'
Go
;WITH a
AS
(
SELECT [name],[start_date]
FROM #T1 AS a
WHERE NOT EXISTS ( SELECT 1
FROM #T1 AS b
WHERE [name] = a.[name]
AND [start_date] <a.[start_date]
AND NOT EXISTS ( SELECT 1
FROM #T1
WHERE [start_date]< a.[start_date]
AND [start_date] >b.[start_date] ) )
),b AS
(
SELECT [name],[end_date]
FROM #T1 AS a
WHERE NOT EXISTS ( SELECT 1
FROM #T1 AS b
WHERE [name] = a.[name]
AND [start_date] > a.[start_date]
AND NOT EXISTS ( SELECT 1
FROM #T1
WHERE [start_date] > a.[start_date]
AND [start_date] < b.[start_date] ) )
)
SELECT a.[name]
,a.[start_date]
,[end_date] = MIN(b.[end_date])
FROM a
INNER JOIN b ON a.[name] = b.[name] AND a.[start_date]<=b.[end_date]
GROUP BY a.[name]
,a.[start_date]
/*
name start_date end_date
A 2014-01-01 00:00:00.000 2014-06-06 00:00:00.000
B 2014-01-01 00:00:00.000 2014-03-03 00:00:00.000
B 2014-05-05 00:00:00.000 2014-07-07 00:00:00.000
*/
WITH t1([name],start_date,end_date) AS (
SELECT 'A','2014.1.1','2014.3.3' UNION ALL
SELECT 'A','2014.5.5','2014.6.6' UNION ALL
SELECT 'A','2014.3.3','2014.5.5' UNION ALL
SELECT 'B','2014.1.1','2014.3.3' UNION ALL
SELECT 'B','2014.5.5','2014.6.6' UNION ALL
SELECT 'B','2014.6.6','2014.7.7'
)
,t2 AS (
SELECT [name],
start_date,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY start_date) n
FROM t1
WHERE NOT EXISTS (SELECT *
FROM t1 t
WHERE t.[name] = t1.[name]
AND t.end_date = t1.start_date
)
)
,t3 AS (
SELECT [name],
end_date,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY start_date) n
FROM t1
WHERE NOT EXISTS (SELECT *
FROM t1 t
WHERE t.[name] = t1.[name]
AND t.start_date = t1.end_date
)
)
SELECT t2.[name],
t2.start_date,
t3.end_date
FROM t2
JOIN t3
ON t3.[name] = t2.[name]
AND t3.n = t2.n
name start_date end_date
---- ---------- --------
A 2014.1.1 2014.6.6
B 2014.1.1 2014.3.3
B 2014.5.5 2014.7.7
SELECT [name]
,[start_date] = MIN([start_date])
,[end_date] = MAX([end_date])
FROM T1
GROUP BY [name]