我有这个数据表
CREATE TABLE t1
(
id serial NOT NULL,
in_quantity bigint NULL,
price money NOT NULL,
out_quantity bigint NULL,
stamp timestamp NOT NULL
);
例如,有这样的数据(日期相同,但时间不同)。
INSERT INTO t1 (in_quantity, price, out_quantity, stamp)
VALUES
( 100, 10.00, NULL, '2014-10-20 00:00:00'), -- id = 1
( 200, 11.00, NULL, '2014-10-20 00:01:00'), -- id = 2
( 300, 12.00, NULL, '2014-10-20 00:02:00'), -- id = 3
(NULL, 13.00, 400, '2014-10-20 00:03:00'), -- id = 4
(NULL, 14.00, 500, '2014-10-20 00:04:00'), -- id = 5
( 600, 15.00, NULL, '2014-10-20 00:15:00'), -- id = 6
( 700, 16.00, NULL, '2014-10-20 00:16:00'), -- id = 7
( 800, 17.00, NULL, '2014-10-20 00:17:00'), -- id = 8
(NULL, 18.00, 900, '2014-10-20 00:18:00'), -- id = 9
(NULL, 19.00, 1000, '2014-10-20 00:19:00'), -- id = 10
(2300, 23.00, NULL, '2014-10-20 00:23:00'), -- id = 11
(2400, 24.00, NULL, '2014-10-20 00:24:00'); -- id = 12
我需要从这个表中获取特定日期范围内每天最大进出数量的行集合。
例如,给定以下集合:
( "2014-10-20 00:00:00" : "2014-10-20 00:05:00" ]
( "2014-10-20 00:05:00" : "2014-10-20 00:10:00" ]
( "2014-10-20 00:10:00" : "2014-10-20 00:15:00" ]
( "2014-10-20 00:15:00" : "2014-10-20 00:20:00" ]
( "2014-10-20 00:20:00" : "2014-10-20 00:25:00" ]
我的期望结果是,通过这个例子,能够实现以下目标。
interval begin | interval end | max_in_q | max_in_q_id | max_out_q | max_out_q_id
======================+=======================+==========+=============+===========+=============
"2014-10-20 00:00:00" | "2014-10-20 00:05:00" | 300 | 3 | 400 | 4
"2014-10-20 00:05:00" | "2014-10-20 00:10:00" | NULL | NULL | NULL | NULL
"2014-10-20 00:10:00" | "2014-10-20 00:15:00" | NULL | NULL | NULL | NULL
"2014-10-20 00:15:00" | "2014-10-20 00:20:00" | 800 | 8 | 1000 | 10
"2014-10-20 00:20:00" | "2014-10-20 00:25:00" | 2400 | 12 | NULL | NULL
所以,我可以通过以下查询生成这样的集合
SELECT
i::timestamp AS dleft,
i::timestamp + '1 hour' AS dright
FROM
generate_series('2014-10-20 00:00:00'::timestamp, '2014-10-20 23:00:00'::timestamp, '1 hour') AS i
但我想不出如何让聚合函数在每个小范围内运行,并且如何联接结果。