检索任意时间间隔的聚合

use*_*456 4 sql postgresql generate-series

这是我到目前为止的查询,创建每日栏:

SELECT DISTINCT date_trunc('hour',t) AS date,
min(price) OVER w,
max(price) OVER w,
first_value(price) OVER w,
last_value(price) OVER w
FROM ticker
WINDOW w AS (PARTITION BY date_trunc('hour',t));
Run Code Online (Sandbox Code Playgroud)

将"小时"更改为"分钟"或"天"将为我提供与这些单位对应的条形图.

但是,如果我想要5分钟或15分钟的酒吧怎么办?date_trunc()不支持这些,我正在寻找一个很好的方式来做到这一点.

Erw*_*ter 7

以15分钟为间隔,以您的示例为基础:

SELECT DISTINCT
     , date_trunc('hour', t) AS h
     , floor(EXTRACT(minute FROM t) / 15) AS m15
     , min(price) OVER w
     , max(price) OVER w
     , first_value(price) OVER w
     , last_value(price) OVER w
FROM   ticker
WINDOW w AS (PARTITION BY date_trunc('hour', t)
                        , floor(extract(minute FROM t) / 15));
Run Code Online (Sandbox Code Playgroud)

也工作5分钟.


任何时间段内任何常规时间间隔的更通用的解决方案:

WITH x AS (
    SELECT t1, t1 + interval '5min' AS t2
    FROM   generate_series(timestamp '2012-07-18 00:00'
                         , timestamp '2012-07-18 23:55'
                         , interval '5 min') AS t1
    )
SELECT DISTINCT ON (1)
       x.t1
     , min(price)         OVER w
     , max(price)         OVER w
     , first_value(price) OVER w
     , last_value(price)  OVER w
FROM   x
JOIN   ticker y ON y.t >= x.t1  -- use LEFT JOIN to include empty intervals
               AND y.t <  x.t2  -- don't use BETWEEN
WINDOW w AS (PARTITION BY x.t1)
ORDER  BY x.t1;
Run Code Online (Sandbox Code Playgroud)

相关答案以及更多解释: