显示 GROUP BY 的所有单独行,按组的基数排序
Display all individual rows of a GROUP BY, sorted by the cardinality of the groups
给出这样的 table:
User A
---------------
Erik 1278
Bob 16287
Alice 9723
Daniel 7
Erik 8
Bob 162
Erik 126
如何select所有行,grouped/ordered用户行数最多?
结果将是:
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
,但仍然能够看到该组的“每一行”。如何做到这一点?
您可以在 order by
:
中使用 window 函数
order by count(*) over (partition by user) desc,
user
第一个键计算每个用户的行数。第二个让所有用户在一起(如果有联系,这很重要)。如果您想为每个用户的行排序,您可以添加第三个键。
编辑:
在旧版本中,您可以使用子查询:
order by (select count(*) from user u2 where u2.user= u.user) desc,
user
给出这样的 table:
User A
---------------
Erik 1278
Bob 16287
Alice 9723
Daniel 7
Erik 8
Bob 162
Erik 126
如何select所有行,grouped/ordered用户行数最多?
结果将是:
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
,但仍然能够看到该组的“每一行”。如何做到这一点?
您可以在 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