SQL: 多个嵌套聚合函数

SQL: multiple nested aggregate functions

我有一个 PostgreSQL table 看起来像:

artists | songs  
===================
artist1 | song a
artist1 | song b
artist2 | song c

并且我想做一个 select 声明,为每个艺术家提供曲目数量以及他的曲目数量与拥有最多曲目的艺术家数量之间的差异

所以在这种情况下

artist  | number songs | difference
====================================
artist1 | 2            | 0
artist2 | 1            | 1

我遇到的问题是我使用 count(songs) 作为歌曲的数量,并且在相同的结果中还使用 max(count(songs))(需要计算差异)并且同时使用这两种方法给我带来了问题嵌套聚合函数。

您可以结合使用聚合函数(计算每个艺术家的歌曲数量)和 window 函数来生成此结果:

SELECT   artist, 
         COUNT(*) AS num_songs, 
         MAX(COUNT(*)) OVER (ORDER BY COUNT(*) DESC) - COUNT(*) AS diff
FROM     artists                                                       
GROUP BY artist;

它有点笨拙,但它确实有效。

编辑:
正如@a_horse_with_no_name 评论的那样,over 子句中的 order by 子句是多余的。删除它肯定会使代码更易于阅读:

SELECT   artist, 
         COUNT(*) AS num_songs, 
         MAX(COUNT(*)) OVER () - COUNT(*) AS diff
FROM     artists                                                       
GROUP BY artist;