Postgres“group by”自反射函数(返回聚合消耗的主键数组)

时间:2015-01-05 20:44:19

标签: postgresql-9.3

执行“分组依据”聚合查询非常简单。我感兴趣的是,如果有一个功能/快捷方式返回包含在聚合函数中的主键数组,并追加/包含查询结果。

例如:

链接到sqlfiddle上的示例:http://www.sqlfiddle.com/#!15/5900d3/1

CREATE TABLE foo (
      id serial NOT NULL,               -- unique key
      eloc int,                         -- location of event
      rperiod character varying(1),     -- reference period
      rdate timestamp with time zone,   -- reference date
      edur int,                         -- duration in seconds
      CONSTRAINT foo_pkey PRIMARY KEY (id)
    );

INSERT INTO foo (id, eloc, rperiod, rdate, edur) VALUES 
    (1, 1, 'h', '2014-12-20 08:05:01', 123),
    (2, 2, 'h', '2014-12-20 13:45:25', 73),
    (3, 2, 'h', '2014-12-20 15:20:11', 91),
    (4, 1, 'h', '2014-12-21 13:45:01', 302),
    (5, 4, 'h', '2014-12-21 13:45:01', 45),
    (6, 2, 'h', '2014-12-21 13:45:01', 103),
    (7, 3, 'h', '2014-12-20 11:17:52', 33),
    (8, 1, 'h', '2014-12-21 13:45:01', 164),
    (9, 4, 'h', '2014-12-21 13:45:01', 234)

基本群组查询如下所示......

SELECT eloc, rperiod, rdate::date, sum(edur) 
   FROM foo WHERE   
      rperiod =  'h' 
   GROUP BY
      eloc, rperiod, rdate::date 
   ORDER BY eloc, rdate

以下是标准结果:

1;"h";"2014-12-20";123
1;"h";"2014-12-21";466
2;"h";"2014-12-20";164
2;"h";"2014-12-21";103
3;"h";"2014-12-20";33
4;"h";"2014-12-21";279

以下是我希望我的查询返回...(注意包含主键数组的附加字段):

1;"h";"2014-12-20";123;{1}
1;"h";"2014-12-21";466;{4, 8}
2;"h";"2014-12-20";164;{2, 3}
2;"h";"2014-12-21";103;{6}
3;"h";"2014-12-20";33;{7}
4;"h";"2014-12-21";279;{5, 9}

我非常确定我可以通过一个表来实现这个目的,并且可以使用非常具体的查询。关于如何更一般地做这个的任何想法?是否有某种postgres功能可以为我们做到这一点?

1 个答案:

答案 0 :(得分:1)

这很简单,只需添加对array_agg的调用

即可
SELECT eloc,
       rperiod,
       rdate::DATE,
       sum(edur),
       array_agg (id)
FROM foo
WHERE rperiod = 'h'
GROUP BY eloc, rperiod, rdate::DATE
ORDER BY eloc,rdate;

SQLFiddle:http://www.sqlfiddle.com/#!15/5900d3/2