SQL:多个嵌套聚合函数
Posted
技术标签:
【中文标题】SQL:多个嵌套聚合函数【英文标题】:SQL: multiple nested aggregate functions 【发布时间】:2016-03-20 14:07:20 【问题描述】:我有一个 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))
(需要计算差异)并且使用两者都会给我带来嵌套聚合函数的问题。
【问题讨论】:
【参考方案1】:您可以结合使用聚合函数(计算每个艺术家的歌曲数量)和窗口函数来产生这个结果:
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:多个嵌套聚合函数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用单个 SQL 聚合函数查询为同一个聚合函数获取多个结果?