在1分钟内发生的重复记录的SQL查找

6
我正在检查数据库中记录的网站条目。
列包括:浏览器、点击类型ID、引荐者和日期时间。
如果多行具有相同的浏览器、点击类型ID和引荐者,并且时间戳在一分钟内(相互之间)被视为重复。
我需要一条SQL语句,可以根据上述条件查询这些重复项。
非常感谢您的帮助。

删除?全选?测试并防止插入? - gbn
什么样的方言?听说过按组排序吗? - Paco
5
一个有趣的问题是,你认为在1分钟内的时间范围内是什么?如果在12:30:05有一排队,12:30:45又来了一排队,接着12:31:10又来了一排队,前两个人在一分钟内,后两个人也在一分钟内,但第一个和最后一个人不在同一分钟内。你需要想办法解决这个问题并将其纳入你的解决方案中。 - BBlake
你想返回重复值还是返回不重复的值(无重复项)? - Gabriel McAdams
2个回答

15
SELECT
     T1.browser,
     T1.click_type,
     T1.referrer,
     T1.datetime,
     T2.datetime
FROM
     My_Table T1
INNER JOIN My_Table T2 ON
     T2.browser = T1.browser AND
     T2.click_type = T1.click_type AND
     T2.referrrer = T1.referrer AND
     T2.datetime > T1.datetime AND
     T2.datetime <= DATEADD(mi, 1, T1.datetime)

1
你也可以在选择语句中去掉t2浏览器、click_type和referrer的引用,因为它们始终等于t1。 - ryanulit
谢谢您的回答。不过,您有没有想过如何在1分钟内计算出现次数?直接使用“count”和“groupby”将无法得到准确的结果。它会给出“成功自连接”的数量,而不是连接前左表的数量。 - Cheok Yan Cheng
你需要明确具体想要什么。20条记录的字符串,每个记录之间相隔5秒,可能在一分钟内是12条,也可能在另一分钟内是8条,或者它们可能是4-12-4或其他形式。最好自己提出问题,而不是试图在这里的评论中进行整理。 - Tom H

1

为了防止插入

INSERT MyTable (browser, click_type_id, referrer, [datetime])
SELECT
    @browser, @click_type_id, @referrer, @datetime
WHERE
    NOT EXISTS (SELECT *
        FROM
           MyTable M2
        WHERE
           browser = @browser AND click_type_id = @click_type_id AND referrer = @referrer
           AND
           [datetime] < DATEADD(minute, -1, @datetime))

在现有数据中查找(依赖于smalldatetime的准确性,可能有助于避免问题,如对问题的评论所述)

SELECT
   browser, click_type_id, referrer, COUNT(*)
FROM
   MyTable
GROUP BY
    browser, click_type_id, referrer, (CAST [datetime] AS smalldatetime)
HAVING
    COUNT(*) > 1

1
如果你有一个如12:00:25和12:01:14这样的例子,smalldatetime转换不会成为一个问题吗? - Tom H
@Tom H.:是的,但有时这取决于你如何定义一分钟;-) - gbn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接