执行“分组依据”聚合查询非常简单。我感兴趣的是,如果有一个功能/快捷方式返回包含在聚合函数中的主键数组,并追加/包含查询结果。
例如:
链接到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功能可以为我们做到这一点?
答案 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