2009-12-15 62 views
4

我检查网站entrys内存在的:浏览器,click_type_id,引荐和日期时间SQL查找重复记录1分钟都被记录在数据库</p> <p>列彼此

如果多行具有相同的浏览器,click_type_id和引荐来源并被加时间戳(发生在彼此的1分钟内),它们被认为是重复的。

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

任何帮助表示赞赏。

+0

删除?全选?测试并防止插入? – gbn 2009-12-15 20:51:26

+0

什么样的方言?有没有听说过小组? – Paco 2009-12-15 20:56:22

+5

一个有趣的问题是,你在另一分钟之内会考虑什么?如果在12:30:05有一排,12:30:45有一排,而在12:31:10有一排,前两个在一分钟之内,后两个也是,但第一个和最后一个不是。你必须弄清楚如何解决这个问题,作为你的解决方案的一部分。 – BBlake 2009-12-15 20:57:34

回答

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转换不会成为问题吗? – 2009-12-15 21:00:47

+0

@Tom H:是的,但是它的时间取决于你如何定义一分钟;-) – gbn 2009-12-16 05:32:09

12
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和引用者引用,因为它们将始终等于t1。 – ryanulit 2009-12-15 21:12:15

+0

好点。这是完成 – 2009-12-16 15:02:33

+0

感谢您的答案。然而,任何想法如何在1分钟内统计出现次数。直接使用'count'和'groupby'不会产生准确的结果。它给出了“成功自联接次数”,而不是加入前的左表数量。 – 2017-02-06 10:31:14