0

假设我的原始数据是:

Timestamp   High Low Volume
10:24.22345 100   99  10
10:24.23345 110  97   20
10:24.33455 97    89  40
10:25.33455 60    40  50
10:25.93455 40    20  60

采样时间为 1 秒,输出数据应如下所示(添加附加列):

Timestamp   High Low Volume Count
10:24       110   89  70     3
10:25       60    20  110    2

抽样单位从不同1 second, 5 sec, 1 minute, 1 hour, 1 day, ...

如何使用 Rails 在 PostgreSQL 数据库中快速查询采样数据?

我想通过获取错误来填充所有间隔

ERROR:  JOIN/USING types bigint and timestamp without time zone cannot be matched

SQL

SELECT 
       t.high,
       t.low
FROM 
(

  SELECT generate_series(
    date_trunc('second', min(ticktime)) ,
    date_trunc('second', max(ticktime)) ,
    interval '1 sec'
  ) FROM czces  AS g (time)

  LEFT JOIN
  (
    SELECT 
      date_trunc('second', ticktime) AS time ,
      max(last_price) OVER w AS high ,
      min(last_price) OVER w AS low 
   FROM czces
   WHERE product_type ='TA' AND contract_month = '2014-08-01 00:00:00'::TIMESTAMP 
     WINDOW w AS (
      PARTITION BY date_trunc('second', ticktime)
      ORDER BY ticktime ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
      )
  ) t USING (time)



  ORDER BY 1 
) AS t ;
4

1 回答 1

1

只需date_trunc()在聚合之前使用。适用于基本时间单位 1 秒、1 分钟、1 小时、1 天 - 但不适用于 5 秒。任意间隔稍微复杂一些,请参见下面的链接!

SELECT date_trunc('second', timestamp) AS timestamp -- or minute ...
     , max(high) AS high, min(low) AS low, sum(volume) AS vol, count(*) AS ct
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

如果样本点没有行,则结果中没有行。如果每个采样点都需要一行:

SELECT g.timestamp, t.high, t.low, t.volume, t.ct
FROM  (SELECT generate_series(date_trunc('second', min(timestamp))
                             ,date_trunc('second', max(timestamp))
                             ,interval '1 sec') AS g (timestamp) -- or minute ...
LEFT JOIN  (
   SELECT date_trunc('second', timestamp) AS timestamp           -- or minute ...
        , max(high) AS high, min(low) AS low, sum(volume) AS vol, count(*) AS ct
   FROM   tbl
   GROUP  BY 1
   ) t USING (timestamp)
ORDER  BY 1;

LEFT JOIN是必不可少的。

对于任意间隔:

旁白:不要timestamp用作列名。它是标准 SQL 中的基本类型名称和保留字。对于实际上不是时间戳的数据,它也会产生误导。

于 2014-12-08T08:09:11.837 回答