【问题标题】:Retrieve aggregates for arbitrary time intervals检索任意时间间隔的聚合
【发布时间】:2012-07-17 00:51:18
【问题描述】:

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

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));

将“小时”更改为“分钟”或“天”会给我对应于这些单位的条形图。

但是,如果我想要 5 分钟或 15 分钟的酒吧怎么办? date_trunc() 不支持这些,我正在寻找一种优雅的方式来实现它。

【问题讨论】:

    标签: sql postgresql generate-series


    【解决方案1】:

    以 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));
    

    也可以工作 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;
    

    更多解释的相关答案:

    【讨论】:

    • 嗨,xy 是什么意思?
    • @poc:xCTE的名字,yticker的表别名,在这里声明:JOIN ticker y,是JOIN ticker AS y的缩写
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多