如何在postgres的选定时间段内查询每5秒(或任何其他用户定义的时间段)的最大和最小记录

时间:2017-09-17 13:54:47

标签: postgresql

我有一张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分钟。有办法解决吗?

1 个答案:

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