我有一个 PostgreSQL 表,如下所示:
artists | songs
===================
artist1 | song a
artist1 | song b
artist2 | song c
我想做一个选择语句,为每个艺术家提供轨道数量以及他的轨道数量与拥有最多轨道的艺术家数量之间的差异
所以在这种情况下
artist | number songs | difference
====================================
artist1 | 2 | 0
artist2 | 1 | 1
我遇到的问题是我正在使用 count(songs)
来计算歌曲的数量,同时还使用 max(count(songs))
(需要计算差异)在相同的结果中同时使用这两个给我带来了嵌套聚合函数的问题。
最佳答案
您可以结合使用聚合函数(计算每个艺术家的歌曲数量)和窗口函数来生成此结果:
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;
关于SQL:多个嵌套聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34278124/