我有一个样本表,如下所示:
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)
答案 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)