2009-12-15 60 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