下面是一个示例表。
DECLARE @Temp TABLE (ID int, Name varchar(50), LiveDate Date, LiveTime time(7), Duration_Seconds int)
INSERT INTO @Temp (ID, Name, LiveDate, LiveTime, Duration)
SELECT 1, 'ABC', '2013-08-19', '00:01:00.0000000', 300
UNION ALL
SELECT 2, 'ABC', '2013-08-19', '00:01:00.0000000', 300
UNION ALL
SELECT 3, 'DEF', '2013-08-19', '00:01:00.0000000', 300
UNION ALL
SELECT 4, 'DEF', '2013-08-19', '00:03:00.0000000', 300
UNION ALL
SELECT 5, 'GHI', '2013-08-19', '00:01:00.0000000', 300
UNION ALL
SELECT 6, 'GHI', '2013-08-19', '00:01:00.0000000', 300
UNION ALL
SELECT 7, 'GHI', '2013-08-19', '00:03:00.0000000', 300
UNION ALL
SELECT 8, 'GHI', '2013-08-19', '00:09:00.0000000', 300
UNION ALL
SELECT 9, 'GHI', '2013-08-20', '00:06:00.0000000', 300
UNION ALL
SELECT 10, 'JKL', '2013-08-19', '00:01:00.0000000', 300
UNION ALL
SELECT 11, 'MNO', '2013-08-19', '00:01:00.0000000', 300
SELECT *,
CASE
WHEN COUNT(*) OVER (PARTITION BY Name, LiveDate, LiveTime) > 1 THEN 1
ELSE 0
END AS Duplicate
FROM @Temp
现在,我想要的输出如下。
/*
Desired Output
ID Name LiveDate Livetime Duration_Seconds Duplicate OverLap
1 ABC 2013-08-19 00:01:00.0000000 300 Yes No
2 ABC 2013-08-19 00:01:00.0000000 300 Yes No
3 DEF 2013-08-19 00:01:00.0000000 300 No Yes
4 DEF 2013-08-19 00:03:00.0000000 300 No Yes
5 GHI 2013-08-19 00:01:00.0000000 300 Yes Yes
6 GHI 2013-08-19 00:01:00.0000000 300 Yes Yes
7 GHI 2013-08-19 00:03:00.0000000 300 No Yes
8 GHI 2013-08-19 00:09:00.0000000 300 No No
9 GHI 2013-08-20 00:06:00.0000000 300 No No
10 JKL 2013-08-19 00:01:00.0000000 300 No No
11 MNO 2013-08-19 00:01:00.0000000 300 No No
*/
我怎么能这样做?任何帮助将不胜感激。
我不确定如何找到重叠。
如果重叠为是/真/ 1,则名称和日期必须相同。 然后,我们要看时间和持续时间。 让我们说GHI,ID 5和6的时间= 12:01,ID 7的12:03。 但根据持续时间,即300秒或5分钟,因为12:03距离12:01不到5分钟,我想为这三个记录标记Overlap = Yes / True / 1。
将LiveTime视为开始时间。 Duration_Seconds作为记录生存的总时间。 所以GHI ID 5& 6 LiveTime = 12:01 AM,持续300秒(5分钟)。所以它在凌晨12:01上线,并在凌晨12:06死亡。 GHI ID 7于上午12:03上线,同名和日期相同。但是它应该没有,因为我们已经有从上午12:01到12:06的录制直播,具有相同的名称和日期。因此,所有GHI都标记为重叠=是/真/ 1
希望这可以帮助您理解我想要做的事情。
THX
答案 0 :(得分:2)
这样可行,可能有一种更简单的方法:
;WITH cte AS ( SELECT *,
CASE
WHEN COUNT(*) OVER (PARTITION BY Name, LiveDate, LiveTime) > 1 THEN 1
ELSE 0
END AS Duplicate
FROM @Temp)
SELECT DISTINCT a.*,CASE WHEN b.ID IS NOT NULL THEN 1 ELSE 0 END 'Overlap'
FROM cte a
LEFT JOIN cte b
ON a.NAME = b.NAME
AND a.LiveDate = b.LiveDate
AND ((b.LiveTime > a.Livetime AND b.LiveTime < DATEADD(SECOND,a.Duration_Seconds,a.LiveTime))
OR (a.LiveTime > b.Livetime AND a.LiveTime < DATEADD(SECOND,b.Duration_Seconds,b.LiveTime)))
如果上述条件不适用于所有重叠实例,则可能需要调整JOIN
条件。