计算 DISTINCT 值的出现次数

Posted

技术标签:

【中文标题】计算 DISTINCT 值的出现次数【英文标题】:Count the occurrences of DISTINCT values 【发布时间】:2010-11-23 16:46:07 【问题描述】:

我正在尝试找到一个 mysql 查询,该查询将在特定字段中查找 DISTINCT 值,计算该值的出现次数,然后按计数对结果进行排序。

示例数据库

id         name
-----      ------
1          Mark
2          Mike
3          Paul
4          Mike
5          Mike
6          John
7          Mark

预期结果

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1

【问题讨论】:

【参考方案1】:
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

【讨论】:

组在这里做什么?不清楚目的是什么?如果您只是简单地阅读它,它似乎应该没有它。 虽然 Amber 的问题是该问题的正确答案,但我想对她的评论进行更正,以免使新人误入歧途。如果你在 MySQL 查询中去掉“group by”,你不会得到 [Mike, 1], [Mike, 1],你会得到一个结果,它将是返回的第一行上的名称,以及一个计数表中的行数,所以在这种情况下 [Mark, 7]。 count(),作为一个聚合函数作用于整个数据集,对指定的字段进行求和、计数或连接到一行。 Group by 根据指定字段的唯一组合将数据集细分为块 @Avatar_Squadron 非常正确;我已经删除了之前的评论 - 它不在我的脑海中,而且我并不倾向于真正观察没有 group 的 count 的结果。 :) 我一直在努力消除没有重复的结果。您不能将count(*) > 1 放入where 子句中,因为它是一个聚合函数。您还会收到一条非常无用的消息:“无效使用组功能”。正确的方法是将计数命名为name,COUNT(*) as cnt 并添加一个having clause,如下所示:HAVING count > 1 @PatrickM 是的,HAVING 用于应在聚合之后应用的条件,而WHERE 用于应在其之前应用的条件。 (另一种思考方式是WHERE 适用于原始行数据;HAVING 适用于输出行数据。)【参考方案2】:

这样的事情怎么样:

SELECT
  name,
  count(*) AS num
FROM
  your_table
GROUP BY
  name
ORDER BY
  count(*)
  DESC

您正在选择名称及其出现的次数,但按名称分组,因此每个名称仅选择一次。

最后,按次数以 DESCending 顺序排列,让出现频率最高的用户排在第一位。

【讨论】:

您的查询帮助了我。结果它返回几行。我也想知道如何找到这个结果的计数。尝试了一些查询,但似乎无法对聚合进行计数。你能帮忙吗? @Nav - 数什么?返回的行数?那是SELECT COUNT(DISTINCT name) as count FROM your_table 要计算表的总行数,请在不使用group by 语句的情况下执行Pascal 的查询。 @AutumnLeonardthanx 人。我从您的评论中得到了答案,然后是答案.. :)【参考方案3】:

刚刚将 Amber 的 COUNT(*) 更改为 COUNT(1) 以获得更好的性能。

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

【讨论】:

其实你说的是片面的here

以上是关于计算 DISTINCT 值的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

计算每个唯一值的出现次数

SQL如何查询出某一列中不同值出现的次数?

计算python字典中某个值的出现次数?

VBA |如何计算不同值的出现次数?

计算火花数据框中所有列(300 列)的每个不同值的出现次数

使用 Pig Latin 计算唯一值的出现次数