按行分组为多个组

时间:2015-02-16 07:41:40

标签: sql postgresql group-by

我有一张桌子

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个单独的组。

  1. index大于/等于1的值的总和
  2. index大于/等于2的值的总和
  3. 指数大于/等于3的值的总和
  4. 这必须是通用函数,所以我实际上不知道索引级别,因为它在这里是硬编码的。

    这是示例输出:

    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
    

2 个答案:

答案 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 PRECEDINGCURRENT 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