【问题标题】:Using sql, how do get rows with count for duplicates?使用 sql,如何获取具有重复计数的行?
【发布时间】:2012-02-04 01:11:40
【问题描述】:

如何使用 select 语句计算重复行(日期和名称相同)?

这是我的桌子

id  date        name
1   01/02/12    sam  
2   01/02/12    john  
3   02/04/12    eddie  
4   01/06/12    joe 
5   01/02/12    john  
6   01/02/12    john
7   02/04/12    eddie
8   01/05/12    eddie
9   01/07/12    joe 

结果应该是这样的:

id  date        name   count
1   01/02/12    sam    1
    01/02/12    john   3
    02/04/12    eddie  2
4   01/06/12    joe    1
8   01/05/12    eddie  1
9   01/07/12    joe    1

我需要结果集中的第三列,该列的值将是计数列。如果计数超过 1,我也不需要 id(我认为无论如何这都是不可能的)。我正在使用 mysql。

感谢您的建议。

【问题讨论】:

标签: mysql sql


【解决方案1】:

你可以写:

SELECT MIN(id) AS id, date, name, COUNT(1) AS `count`
  FROM table_name
 WHERE ...
 GROUP BY date, name
;

这将始终提供最少的id 组。如果您特别希望在有重复项时将第一个字段设为NULL,那么您可以将MIN(id) 更改为CASE WHEN COUNT(1) > 1 THEN NULL ELSE MIN(id) END,但听起来您似乎不在乎? p>

【讨论】:

  • 我喜欢这种方法,似乎是最清晰的答案,并且不需要子查询。
  • 您还可以获取所有 id(当重复时)将其添加到 Select 列表中:GROUP_CONCAT(id) AS allId
  • 另外,您实际上并不需要MIN(id)。 MySQL 将让您只使用id 来获取组中行之一的 ID(它不保证是哪一行)。不过,其他一些 RDBMS 对此更为迂腐。
  • @IlmariKaronen:我很清楚这个功能,但我强调既不使用也不推荐它。我很确定它的主要目的是混淆和误导。 (例外:如果我是 JOINing 和 GROUPing BY 一个表的主键,那么我有时会将该功能用于其他列。但仅此而已。)
【解决方案2】:

类似这样的:

select  id, date, name, count(*)
from mytable
group by id, date, name
having count(*) > 1

【讨论】:

  • 这没有意义。 id 似乎是主键;如果你 GROUP BY 它,那么 COUNT(*) 将永远是 1。 (即使你解决了这个问题 - OP 的示例结果 do 包含非重复行,因此 HAVING 子句是错误的。)
【解决方案3】:
select date, name, count(id) as counter
from mytable
group by date, name
having count(id) > 1

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 2018-02-09
    • 2013-05-14
    • 1970-01-01
    • 2015-04-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多