我有一个存储在 PostgreSQL 数据库中的时间序列值(例如,股票市场价格的随机游走)。这是一个非常大的表,我希望能够以同样快的速度处理任意时间跨度的查询。我脑子里有这张图表,我想知道他们是怎么做到的。
一个简单的例子:
WITH t(ts, val) AS ( VALUES
('2012-10-04 00:00:00'::timestamp, 1.11::numeric),
('2012-10-04 00:00:01', 1.21),
('2012-10-04 00:00:02', 1.25),
('2012-10-04 00:00:03', 1.41),
('2012-10-04 00:00:04', 1.31),
('2012-10-04 00:00:05', 1.25),
('2012-10-04 00:00:06', 1.33))
(假设timestamp 列上有一个索引。)该表很大,检索时间跨度(例如,一年四分之一)的所有值需要很长时间。但是,由于我想要对这些数据做的只是绘制一个图表来可视化全球趋势,我并不真的需要从那个时期获取整个数据集,但一个有代表性的子集就可以了。
我想到的事情:
- 生成一个子语句列表,每个子语句检索一个短子时间间隔的任意值(例如,每小时间隔一个值)。
- 聚合值,例如
AVG()
和 group bydate_trunc('hour', ts)
或类似的(但这本身会更快吗?可能会创建另一个包含预聚合值的表?)
有没有办法实现这一目标?