SQL:多个嵌套聚合函数

标签 sql postgresql select aggregate-functions

我有一个 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/

相关文章:

php - SQL 验证!

sql - 如何将两个和的结果相加?

c# - 使用参数的 npgsql 语句

sql - PostgreSQL - 语法错误或附近

html - 更改选择框中所选选项的背景颜色

mysql - SQL 返回不正确的行数

sql - 财务期间的日期时间转换

java - 带有 postgresql 的串行列上的 Spring Data JPA "null value in column xxx violates not-null constraint"

sql-server - SQL Server GROUP BY datetime 忽略小时分钟以及带有日期和总和值的选择

MySQL:统一选择是否总是比单独的简单选择更快?