2013-07-19 136 views
2

的狀態可以說,我們有4個領域檢查重複的記錄

id (INT 11 AUTO_INC) 

email (VAR 50) 

timestamp (INT 11) 

status (INT 1) 

命名record表和表包含以下數據

enter image description here

現在我們可以看到的電子郵件地址[email protected]被複制了4次(時間戳最低的記錄是原始記錄,之後的所有副本都是重複記錄)。多少次使用

SELECT email, count(id) FROM record GROUP BY email HAVING COUNT(id)>1 

我可以很容易地計算使用

SELECT COUNT(DISTINCT email) FROM record 

了獨特的記錄數我也可以很容易找到的電子郵件地址被複制但現在的商業問題是

如何所有重複記錄中有多次STATUS是1?

例如:

因此,所有的數字之和是0 + 1 + 1 + 0 + 2 = 4

這意味着有其中有status = 1在表4點中重複的記錄

問題

多少重複的記錄有狀態= 1?

+0

考慮提供一個sqlfiddle(或適當的ddls無論如何) – Strawberry

+0

關於你的答案的臨時評論http://stackoverflow.com/a/18307508/285587 - 與()數組上的這個事情是不正確的,而你的答案在技術上是正確的。 –

+0

@YourCommonSense謝謝,我知道從5.5開始,'()'概念可以用於訪問數組值,因此我刪除了我的答案並向上投票。再次感謝:) –

回答

1

這是一個更好的新解決方案。它會刪除每封電子郵件的第一個條目,然後計算其餘條目。閱讀起來並不容易,如果可能的話,我會在存儲過程中編寫它,但這是有效的。

select sum(status) 
    from dude d1 
    join (select email, 
       min(ts) as ts 
      from dude 
     group by email) mins 
using (email) 
where d1.ts != mins.ts; 

sqlfiddle

下面

自己的查詢找到原來的答案 「的電子郵件地址被重複多少次使用」

SELECT email, 
     count(id) as duplicates 
    FROM record 
GROUP BY email 
HAVING COUNT(id)>1 

可以很容易地修改答案「有多少條重複記錄的狀態= 1」

SELECT email, 
     count(id) as duplicates_status_sum 
    FROM record 
GROUP BY email 
WHERE status = 1 
HAVING COUNT(id)>1 

這兩個查詢都會回答,包括原始行,所以它實際上是「包括原始行的重複」。您可以從金額減去1,如果原來總是有狀態1.

SELECT email, 
     count(id) -1 as true_duplicates 
    FROM record 
GROUP BY email 
HAVING COUNT(id)>1 

SELECT email, 
     count(id) -1 as true_duplicates_status_sum 
    FROM record 
GROUP BY email 
WHERE status = 1 
HAVING COUNT(id)>1 
+0

謝謝安德烈亞斯,這將分別給出每個電子郵件地址的號碼。我需要獲取符合標準的所有這些記錄的數量,而不是通過電子郵件分組。所以我想說1000個重複記錄的狀態= 1,沒有通過電子郵件分組,因爲有成千上萬個電子郵件地址 –

+0

我們如何知道如果我們計數(id)-1,我們將排除原始記錄?因爲我們沒有在這個查詢中指定哪一個要排除。這可以包括原來的一個,並排除重複:) –

0

如果我的理解沒有錯的,然後你的查詢應該是

SELECT `email` , COUNT( `id`) AS `tot` 
FROM `record` , (
SELECT `email` AS `emt` , MIN( `timestamp`) AS `mtm` 
FROM `record` 
GROUP BY `email` 
) AS `temp` 
WHERE `email` = `emt` 
AND `timestamp` > `mtm` 
AND `status` =1 
GROUP BY `email` 
HAVING COUNT( `id`) >=1 

首先,我們需要得到最小的時間戳然後發現如果你想總和那些這個時間戳和有狀態1.

後插入重複記錄則查詢

SELECT SUM( `tot`) AS `duplicatesWithStatus1` 
FROM (
SELECT `email` , COUNT( `id`) AS `tot` 
FROM `record` , (
SELECT `email` AS `emt` , MIN( `timestamp`) AS `mtm` 
FROM `record` 
GROUP BY `email` 
) AS `temp` 
WHERE `email` = `emt` 
AND `timestamp` > `mtm` 
AND `status` =1 
GROUP BY `email` 
HAVING COUNT( `id`) >=1 
) AS t 

希望這是你想要的

+0

感謝Suraj,它似乎不會丟棄原始記錄,我只需要獲取重複的號碼,並非全部 –

+0

我編輯了我的答案,因爲您需要排除原來的一個,所以我改變了查詢從計數(id)到計數(id)-1 – Suraj

+0

我們如何知道如果我們計數(id)-1,我們將排除原始記錄?因爲我們沒有在這個查詢中指定哪一個要排除。這可以包括原來的一個,並排除重複:) –

0

你可以得到重複記錄的計數有狀態= 1通過

select count(*) as Duplicate_Record_Count 
from (select * 
from record r 
where r.status=1 
group by r.email,r.status 
having count(r.email)>1) t1 

下面的查詢將返回重複的電子郵件與狀態1的計數和時間戳

select r.email,count(*)-1 as Duplicate_Count,min(r.timestamp) as timestamp 
from record r 
where r.status=1 
group by r.email 
having count(r.email)>1 
+0

這是否僅考慮重複記錄並忽略原始記錄? –

+0

我編輯了我的答案,第一個查詢將只返回一個計數,第二個查詢將返回帶有計數的重複電子郵件 –