在特定时间段内查找重复项

时间:2012-12-08 15:04:27

标签: sql sql-server sql-server-2008

我有一个包含以下结构的表

ID  Person  LOG_TIME
-----------------------------------
1   1       2012-05-21 13:03:11.550
2   1       2012-05-22 13:09:37.050 <--- this is duplicate
3   1       2012-05-28 13:09:37.183
4   2       2012-05-20 15:09:37.230
5   2       2012-05-22 13:03:11.990 <--- this is duplicate
6   2       2012-05-24 04:04:13.222 <--- this is duplicate
7   2       2012-05-29 11:09:37.240

我有一些应用程序作业用数据填充此表。

有一项业务规则,即每个人每7天应该只有1条记录。

从上面的例子中,记录#2,5和6被认为是重复的,而1,3,4和7是可以的。

我希望有一个SQL查询,可以在不到7天的时间内检查同一个人是否有记录。

4 个答案:

答案 0 :(得分:1)

请参阅我对SQLFiddle here的尝试。

您可以使用基于DATEDIFF()的联接来查找记录间隔时间不到7天的记录:

WITH TooClose
AS
(
    SELECT
        a.ID AS BeforeID,
        b.ID AS AfterID
    FROM
        Log a
        INNER JOIN Log b ON a.Person = b.Person
                        AND a.LOG_TIME < b.LOG_TIME
                        AND DATEDIFF(DAY, a.LOG_TIME, b.LOG_TIME) < 7
)

但是,这将包括您不认为是“重复”的记录(例如,ID 3,因为它太靠近ID 2)。根据你所说的,我推断记录不是“重复”,如果它太靠近的记录本身就是“重复”。

因此,要应用此规则并获取重复的最终列表:

SELECT
    AfterID AS ID
FROM
    TooClose
WHERE
    BeforeID NOT IN (SELECT AfterID FROM TooClose)

答案 1 :(得分:1)

;WITH cte AS
 (
  SELECT ID, Person, LOG_TIME,
         DATEDIFF(d, MIN(LOG_TIME) OVER (PARTITION BY Person), LOG_TIME) AS diff_date
  FROM dbo.Log_time
  )
SELECT *
FROM cte
WHERE diff_date BETWEEN 1 AND 6

SQLFiddle上的演示

答案 2 :(得分:0)

请看一下这个样本。

参考:SQLFIDDLE

查询:

select person, 
datediff(max(log_time),min(log_time)) as diff,
count(log_time)
 from pers 
 group by person
;

select y.person, y.ct
from (
select person, 
datediff(max(log_time),min(log_time)) as diff,
count(log_time) as ct
 from pers 
 group by person) as y
where y.ct > 1
and y.diff <= 7
;


PERSON  DIFF    COUNT(LOG_TIME)
1   1   3
2   8   3


PERSON  CT
1   3

答案 3 :(得分:0)

声明@Count int

set @count=(
select COUNT(*) 
from timeslot  
where (( (TimeFrom<@Timefrom and TimeTo >@Timefrom) 
      or (TimeFrom<@Timeto and TimeTo >@Timeto))
      or (TimeFrom=@Timefrom or TimeTo=@Timeto)))