2012-07-18 54 views
2

聚集这是查询我到目前为止,创建每日酒吧:检索任意时间间隔

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()不支持这些,我正在寻找一个很好的方法来做到这一点。

回答

5

对于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; 

相关答案与更多的解释:

+0

嗨'x'和'y'是什么意思? – newBike 2014-12-10 09:43:41

+0

@poc:'x'是[** CTE **]的名称(http://www.postgresql.org/docs/current/interactive/queries-with.html),'y'是一个表别名对'ticker',这里声明:'JOIN ticker y',这是'JOIN ticker AS y'的缩写 – 2014-12-10 10:17:34