显示 GROUP BY 的所有单独行,按组的基数排序

Posted

技术标签:

【中文标题】显示 GROUP BY 的所有单独行,按组的基数排序【英文标题】:Display all individual rows of a GROUP BY, sorted by the cardinality of the groups 【发布时间】:2021-09-27 06:39:24 【问题描述】:

给定这样的表格:

User     A
---------------
Erik     1278
Bob      16287
Alice    9723
Daniel   7
Erik     8
Bob      162
Erik     126

如何选择所有行,按行数最多的用户分组/排序?

结果是:

Erik     1278            # Erik is first because 3 rows with him
Erik     8
Erik     126
Bob      16287           # Bob is 2nd because 2 rows
Bob      162
Alice    9723
Daniel   7

都没有

SELECT * FROM t ORDER BY user 

也没有

SELECT *, COUNT(1) as frequency FROM t GROUP BY user ORDER BY frequency DESC

有效,确实后者只显示 Erik 一行,Bob 一行,...

似乎我需要一个GROUP BY,但仍然能够看到该组的“每一行”。如何做到这一点?

【问题讨论】:

【参考方案1】:

order by中可以使用窗口函数:

order by count(*) over (partition by user) desc,
         user

第一个键计算每个用户的行数。第二个将所有用户保持在一起(如果有联系,这很重要)。如果您想为每个用户对行进行排序,可以添加第三个键。

编辑:

在旧版本中,您可以使用子查询:

order by (select count(*) from user u2 where u2.user= u.user) desc,
         user

【讨论】:

感谢@GordonLinoff 的回答。 OVER (PARTITION ...) 似乎需要最新版本的 Sqlite3(请参阅 sqlite.org/windowfunctions.html#history)。你认为没有这个最近的功能有解决方案吗?我将尝试更新我的 Sqlite 版本,但由于它可能会破坏使用旧版本的旧工具,我也在寻找另一种解决方案。

以上是关于显示 GROUP BY 的所有单独行,按组的基数排序的主要内容,如果未能解决你的问题,请参考以下文章

R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和使用tapply函数按组聚合求和按组聚合求和(使用dplyr包)

按组的每个出现值构建计数列

SUM FIRST_VALUE或SUM group by仍显示所有行吗?

mysql 可以group by 两个字段吗

mysql group by 能用到索引么

SQL Group By Count 过滤优化