【问题标题】:How to rank groups of data?如何对数据组进行排序?
【发布时间】:2020-09-07 16:57:53
【问题描述】:

鉴于以下情况,并负责按每组内的 SUM(体积)对原始数据进行排名:

group_id    volume
1           2
1           3
2           5
3           1
3           3

如何获得以下内容?

group_id    volume  group_volume    rank
1           2       5               1
1           3       5               1
2           5       5               2
3           1       4               3
3           3       4               3

我可以轻松获得group_volume,但我正在努力解决如何打破排名的关系,而不是在单独的子查询中按 + 排名分组并加入。

SELECT *
, SUM(volume) OVER (PARTITION BY group_id) AS grouped_volume
, ... AS rank
FROM groups

【问题讨论】:

    标签: sql postgresql-9.4


    【解决方案1】:

    使用 CTE 和 Dense_rank

    WITH CTE1 AS (SELECT group_id, volume, 
                  sum(volume) over(partition by group_id) group_volume
    from table1)
    SELECT A.*, dense_rank() over( order by  group_id, group_volume) rank FROM CTE1 A;
    

    【讨论】:

      【解决方案2】:

      为此使用两级窗口函数:

      select g.*,
             dense_rank() over (order by group_volume desc, group_id) as rank
      from (select g.*,
                   sum(volume) over (partition by group_id) as group_volume
            from groups g
           ) g;
      

      不需要JOIN

      【讨论】:

      • 这将给出您使用order by group_id, group_volumeorder by group_volume desc, group_id 的错误结果
      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 2012-12-01
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多