显示 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包)