小编Cur*_*rie的帖子

用于从与 Timescaledb N id 对应的表中查找时间戳的最新或最大值的 SQL 查询

我在 timescale db 中有一个表 tab1,它有 3 列标签、时间、值。time 和 tag 组成了表的 pk:(time, tag)。

行数超过 500 万行。我需要找到 N 个标签中每个标签的最新时间戳或最大(时间)。

我尝试过的事情很少,我将与大家分享我的经验:

  1. 内部查询
SELECT "time", "tag", "value"
FROM tab1 
WHERE ("tag","time") IN 
(SELECT "tag", MAX("time") FROM tab1 WHERE "tag" IN(tag1,tag2) GROUP BY "tag" );
Run Code Online (Sandbox Code Playgroud)

这是给出结果,但需要大约 19 秒来执行,这超出了可接受的限制

  1. 使用时间刻度数据库中的最后一个函数
SELECT tag, last(time, time), last(value,time)
FROM tab1
WHERE "tag" IN (tag1,tag2) GROUP BY "tag" ;
Run Code Online (Sandbox Code Playgroud)

这会在 10 秒内给出输出。

我需要找到另一种类似于第二个解决方案的可行解决方案,该解决方案可能性能更好。我尝试了一些其他的东西,如 LATERAL JOIN (3)、WINDOW FUNCTIONS (ROW_NUMBER, PARTITION) (4),但解决方案并不符合预期。

  1. 使用横向给出了多列的交叉,而不是具有预期最大时间的单个值。此外,执行需要 15 秒,但这可能是由于错误的查询。
SELECT table1."tag", table1."time",table1."value" from tab1 as table1 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql time-series lateral-join timescaledb

5
推荐指数
1
解决办法
532
查看次数

标签 统计

lateral-join ×1

postgresql ×1

sql ×1

time-series ×1

timescaledb ×1