根据聚合数据对行进行排序

时间:2018-04-18 08:47:57

标签: sql postgresql

我有一个样本表,如下所示:

select * from sampleTable;
 label | data 
-------+------
 a     |    1
 b     |    2
 c     |    3
 d     |    4
 a     |    5
 b     |    6
(6 rows)

我要求使用“数据”列(即)c的总和值对行进行排序,其中3的数据应该是第一个,而第2个和第6个的组合数据的b应该是最后的,其他的如下所示

 label | data 
-------+------
 c     |    3
 d     |    4
 a     |    1
 a     |    5
 b     |    2
 b     |    6

我试图通过自联接来实现这一点,如下所示。但它似乎有点冗长。我做得对吗,还是有没有更好的方法来实现相同的连接?

select l, data from sampleTable join (select label as l, sum(data) as x from sampleTable group by l) m on label = m.l order by x;
 l | data 
---+------
 c |    3
 d |    4
 a |    1
 a |    5
 b |    2
 b |    6
(6 rows)

3 个答案:

答案 0 :(得分:2)

您可以使用SUM windowed function来避免自我加入,如下所示:

SELECT label
    , data
FROM (
    SELECT *
        , SUM(data) OVER (PARTITION BY label) pts
    FROM sampleTable
    ) AS rez
ORDER BY pts

答案 1 :(得分:2)

您不需要自我加入或子查询。您可以在order by

中使用窗口函数
select t.*
from t
order by sum(data over (partition by label),
         label;

请注意,label包含第二个键。这对于区分数据中的关系很重要。它确保给定标签的所有行都显示在一起。

答案 2 :(得分:1)

只需使用ORDER BY

中的和窗函数即可
SELECT l, d
FROM tab
ORDER BY SUM(d) OVER (PARTITION BY l)

dbfiddle demo