我有一个包含以下结构的表
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天的时间内检查同一个人是否有记录。
答案 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)))