【问题标题】:SQL: multiple nested aggregate functionsSQL:多个嵌套聚合函数
【发布时间】: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))(需要计算差异)并且使用两者都会给我带来嵌​​套聚合函数的问题。

【问题讨论】:

    标签: sql postgresql select aggregate-functions


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多