重复/重叠 - T / SQL

时间:2013-08-19 21:47:04

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

下面是一个示例表。

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

1 个答案:

答案 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条件。