我有一张postgres 9.6表,其中包含数以千计的价格记录和价格。只有四列的表:uid,price,unit,dt。 dt是标准格式的日期时间,例如' 2017-05-01 00:00:00.585'几分之一秒。每秒可能没有几十个记录。
我可以在一段时间内找到MAX和MIN的价格记录。我可以很容易地使用
选择一个时期SELECT date_trunc('second', dt) as time, min(price), max(price)
FROM prices
WHERE dt >= '2017-05-01 00:00:00' AND dt < '2017-05-01 00:00:59'
GROUP BY time
ORDER BY time;
但是date_trunc没有灵活性,也不允许设置任意时间段,例如5秒或10分钟。有办法解决吗?
答案 0 :(得分:1)
使用generate_series
获取您需要搜索的时间间隔范围。然后使用dd + '5 seconds'::interval
获取范围的上限
在此示例中,我们每隔5秒查找一天的数据
WITH ranges as (
SELECT dd as start_range,
dd + '5 seconds'::interval as end_range,
ROW_NUMBER() over () as grp
FROM generate_series
( '2017-05-01 00:00:00'::timestamp
, '2017-05-02 00:00:00'::timestamp
, '5 seconds'::interval) dd
), create_grp as (
SELECT r.grp, r.start_range, r.end_range, p.price
FROM prices p
JOIN ranges r
ON p.date >= r.start_range
AND p.date < r.end_range
)
SELECT grp, start_range, end_range, MIN(price), MAX(price)
FROM create_grp
GROUP BY grp, start_range, end_range
ORDER BY grp