2

假设我们有一个名为record4 个字段的表

id    (INT 11 AUTO_INC)

email (VAR 50)

timestamp (INT 11)

status (INT 1)

该表包含以下数据

在此处输入图像描述

现在我们可以看到电子邮件地址 test@xample.com 被重复了 4 次(时间戳最低的记录是原始记录,之后的所有副本都是重复的)。我可以使用轻松计算唯一记录的数量

SELECT COUNT(DISTINCT email) FROM record

我还可以轻松找出哪个电子邮件地址重复了多少次

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

但现在的商业问题是

STATUS所有重复记录中的 1 是多少次?

例如:

  • 对于 test@example.com,没有状态为 1 的重复记录
  • 对于 second@example.com,有 1 条重复记录的状态为 1
  • 对于 third@example.com,有 1 条重复记录的状态为 1
  • 对于four@example.com,没有状态为1 的重复记录
  • 对于 Five@example.com,有 2 条重复记录的状态为 1

所以所有数字的总和是0 + 1 + 1 + 0 + 2 = 4

这意味着有 4 条重复记录status = 1在表中

问题

有多少 Duplicate 记录的 status = 1 ?

4

3 回答 3

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
于 2013-07-19T08:56:21.297 回答
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

希望这是你想要的

于 2013-07-19T08:57:51.123 回答
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 
于 2013-07-19T08:59:43.977 回答