【问题标题】:Display all individual rows of a GROUP BY, sorted by the cardinality of the groups显示 GROUP BY 的所有单独行,按组的基数排序
【发布时间】: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,但仍然能够看到该组的“每一行”。如何做到这一点?

【问题讨论】:

    标签: sql sqlite group-by sql-order-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 版本,但由于它可能会破坏使用旧版本的旧工具,我也在寻找另一种解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多