我有一张桌子
id index value
1 1 2
2 1 3
3 2 6
4 3 8
我可以这样做:
select sum(value) from table group by index
但我想要的是每行可以转到多个组,伪代码
select sum(value) from table group by >= index
基本上索引是1,2,3,我希望它将这些分组分成3个单独的组。
这必须是通用函数,所以我实际上不知道索引级别,因为它在这里是硬编码的。
这是示例输出:
indexLevelBiggerEquals sumValue
1 19 -- sum of all rows that are >= 1
2 14 -- sum of all rows that are >= 2
3 8 -- sum of all rows that are >= 3
答案 0 :(得分:1)
每个“索引>”的总和group,用例选择要求的值:
select sum(case when index >= 1 then value else 0 end) sum1,
sum(case when index >= 2 then value else 0 end) sum2,
sum(case when index >= 3 then value else 0 end) sum3
from table group by index
这可能是你想要的:
select index,
(select sum(value) from table where index >= t1.index)
from (select distinct index from table) t1;
答案 1 :(得分:1)
使用窗口函数,在有限的表格中工作(请注意,选择默认为UNBOUNDED PRECEDING
至CURRENT ROW
,这是您想要的,但您可以指定其他内容):
INSERT INTO tmp VALUES
(1, 1, 2),
(2, 1, 3),
(3, 2, 6),
(4, 3, 8)
;
SELECT index, SUM(value) OVER ( ORDER BY index DESC )
FROM tmp;
┌───────┬─────┐
│ index │ sum │
├───────┼─────┤
│ 3 │ 8 │
│ 2 │ 14 │
│ 1 │ 19 │
│ 1 │ 19 │
└───────┴─────┘
(4 rows)
编辑:
在查询中使用其他功能:
SELECT index,
COUNT(index),
SUM(SUM(value)) OVER ( ORDER BY index DESC )
FROM tmp
GROUP BY index;
┌───────┬───────┬─────┐
│ index │ count │ sum │
├───────┼───────┼─────┤
│ 3 │ 1 │ 8 │
│ 2 │ 1 │ 14 │
│ 1 │ 2 │ 19 │
└───────┴───────┴─────┘
(3 rows)
SUM(SUM(value))
是必需的,因为value
必须出现在聚合函数中。有关更好的解释,请参阅here。