聚合是一种组合数据以从中获得洞察力的方法。最简单来说,聚合就像是寻找平均值。例如,如果您有显示温度随时间变化的数据,您可以计算这些温度的平均值,或已进行的读数计数。平均值、总和和计数都是简单聚合的示例。

然而,聚合计算可能会变得庞大而缓慢。如果您想查找每天一系列股票的平均开盘价和收盘价,那么您需要更复杂的东西。这就是 Timescale 连续聚合的用武之地。连续聚合可以最大限度地减少您执行查询时需要查找的记录数。

时间序列数据通常增长非常快。这意味着将数据聚合为有用的摘要可能会变得非常缓慢。连续聚合使聚合数据变得非常快。

如果您非常频繁地收集数据,您可能希望将数据聚合为分钟或小时。例如,如果您有一个每秒钟记录温度的表格,您可以找到每小时的平均温度。每次运行此查询时,数据库都需要扫描整个表并每次重新计算平均值。

连续聚合是一种超表,当添加新数据或修改旧数据时,它会在后台自动刷新。系统会跟踪您数据集的更改,并且连续聚合背后的超表会在后台自动更新。

您无需手动刷新连续聚合,它们会在后台持续且增量地更新。与常规 PostgreSQL 物化视图相比,连续聚合的维护负担也低得多,因为每次刷新时都不会从头开始创建整个视图。这意味着您可以专注于处理数据,而不是维护数据库。

由于连续聚合基于超表,因此您可以像查询其他表一样查询它们,并在连续聚合上启用 压缩分层存储。您甚至可以在连续聚合之上创建 分层连续聚合

默认情况下,查询连续聚合会为您提供实时数据。来自物化视图的预聚合数据与尚未聚合的最新数据相结合。这使您在每次查询时都能获得最新的结果。

使聚合更容易的方法主要有三种:物化视图、连续聚合和实时聚合。

物化视图 是标准的 PostgreSQL 功能。它们用于缓存复杂查询的结果,以便您以后可以重复使用。物化视图不会定期更新,但您可以根据需要手动刷新它们。

连续聚合 是 Timescale 独有的功能。它们的工作方式与物化视图类似,但会在后台自动更新,因为新数据会添加到您的数据库中。连续聚合是持续且增量更新的,这意味着与物化视图相比,它们的维护资源密集程度较低。连续聚合基于超表,您可以像查询其他表一样查询它们。

实时聚合 是 Timescale 独有的功能。它们与连续聚合相同,但它们将最新的原始数据添加到先前聚合的数据中,以提供准确和最新的结果,而无需在写入数据时进行聚合。

在本节中,您将创建一个连续聚合,并查询它以获取有关交易数据的更多信息。

金融 sector 经常使用 烛台图 来可视化资产的价格变化。每个烛台代表一个时间段,例如一分钟或一小时,并显示该时间段内资产价格的变化情况。

烛台图是根据每个金融资产在时间段内的开盘价、最高价、最低价、收盘价和成交量数据生成的。这通常缩写为 OHLCV

  • 开盘价
  • 最高价
  • 最低价
  • 收盘价
  • 成交量

在本节中,您将使用 SELECT 语句,通过 minmax 函数查找最高值和最低值,并通过 firstlast 函数查找开盘值和收盘值。然后,您将数据聚合到 1 天的桶中,如下所示

SELECT
time_bucket('1 day', "time") AS day,
symbol,
max(price) AS high,
first(price, time) AS open,
last(price, time) AS close,
min(price) AS low
FROM stocks_real_time srt

然后,您按天和代码组织结果

GROUP BY day, symbol
ORDER BY day DESC, symbol
  1. 在命令提示符下,使用您下载的速查表中的 psql 连接字符串连接到您的数据库。

  2. psql 提示符下,键入此查询

    SELECT
    time_bucket('1 day', time) AS bucket,
    symbol,
    max(price) AS high,
    first(price, time) AS open,
    last(price, time) AS close,
    min(price) AS low
    FROM stocks_real_time srt
    WHERE time > now() - INTERVAL '1 week'
    GROUP BY bucket, symbol
    ORDER BY bucket, symbol
    LIMIT 10;
    -- Output
  3. 键入 q 返回到 psql 提示符。

现在您已经有了聚合查询,您可以使用它来创建连续聚合。

在本节中,您的查询首先创建一个名为 stock_candlestick_daily 的物化视图,然后将其转换为 Timescale 连续聚合

CREATE MATERIALIZED VIEW stock_candlestick_daily
WITH (timescaledb.continuous) AS

然后,您将之前创建的聚合查询作为连续聚合的内容提供

SELECT
time_bucket('1 day', "time") AS day,
symbol,
max(price) AS high,
first(price, time) AS open,
last(price, time) AS close,
min(price) AS low
FROM stocks_real_time srt
GROUP BY day, symbol

当您运行此查询时,您将创建视图,并使用聚合计算填充该视图。这可能需要几分钟才能运行,因为它需要首次对您的所有股票交易数据执行这些计算。

当您创建连续聚合并首次聚合数据后,您可以查询您的连续聚合。例如,您可以查看所有聚合数据,如下所示

SELECT * FROM stock_candlestick_daily
ORDER BY day DESC, symbol;

或者您可以查看单个股票,如下所示

SELECT * FROM stock_candlestick_daily
WHERE symbol='TSLA';
  1. 在命令提示符下,使用您下载的速查表中的 psql 连接字符串连接到您的数据库。

  2. psql 提示符下,键入此查询

    CREATE MATERIALIZED VIEW stock_candlestick_daily
    WITH (timescaledb.continuous) AS
    SELECT
    time_bucket('1 day', "time") AS day,
    symbol,
    max(price) AS high,
    first(price, time) AS open,
    last(price, time) AS close,
    min(price) AS low
    FROM stocks_real_time srt
    GROUP BY day, symbol;
  3. 查询您的连续聚合以获取所有股票

    SELECT * FROM stock_candlestick_daily
    ORDER BY day DESC, symbol
    LIMIT 10;
    -- Output
  4. 查询您的连续聚合以获取特斯拉股票

    SELECT * FROM stock_candlestick_daily
    WHERE symbol='TSLA'
    ORDER BY day DESC
    LIMIT 10;
    -- Output

有关连续聚合如何工作的更多信息,请参阅 连续聚合部分

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页