【问题标题】:SQL find duplicate records occuring within 1 minute of each otherSQL查找彼此间隔1分钟内出现的重复记录
【发布时间】:2009-12-15 20:48:41
【问题描述】:

我正在检查记录在数据库中的网站条目

列:浏览器、click_type_id、引用者和日期时间

如果多行具有相同的浏览器、click_type_id 和 referrer,并且带有时间戳(彼此相距 1 分钟内),则它们被视为重复。

我需要一个可以根据上述条件查询这些重复项的 sql 语句。

感谢任何帮助。

【问题讨论】:

  • 删除?全选?测试并防止插入?
  • 什么方言?听说过分组吗?
  • 一个有趣的问题是,你在 1 分钟内会考虑什么?如果在 12:30:05 有一行,在 12:30:45 有一个,在 12:31:10 有一个,前两个在 1 分钟内,后两个也是,但第一个和最后一个不是。作为解决方案的一部分,您必须弄清楚如何解决这个问题。
  • 您要返回重复值还是返回不同的值(没有重复值)?

标签: sql duplicate-data records


【解决方案1】:
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)

【讨论】:

  • 你也可以去掉选择中的t2浏览器、click_type和referrer引用,因为它们总是等于t1的。
  • 感谢您的回答。但是,任何想法如何计算 1 分钟内的发生次数。直接使用countgroupby 不会产生准确的结果。它给出了“成功自我加入的数量”,而不是加入前的左表数量。
  • 您必须明确说明您想要什么。一串 20 条记录,每条记录在 5 秒内相互间隔可能是一分钟内的 12 条或另一分钟内的 8 条,或者它们可能是 4-12-4 或其他。可能值得开始您自己的问题,而不是尝试在此处的 cmets 中对其进行排序。
【解决方案2】:

为了防止插入

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

【讨论】:

  • 如果您有例如 12:00:25 和 12:01:14,那么 smalldatetime 转换会不会有问题?
  • @Tom H.:是的,但有时这取决于你如何定义一分钟;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2015-01-03
相关资源
最近更新 更多