我在 timescale db 中有一个表 tab1,它有 3 列标签、时间、值。time 和 tag 组成了表的 pk:(time, tag)。
行数超过 500 万行。我需要找到 N 个标签中每个标签的最新时间戳或最大(时间)。
我尝试过的事情很少,我将与大家分享我的经验:
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 秒来执行,这超出了可接受的限制
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),但解决方案并不符合预期。
SELECT table1."tag", table1."time",table1."value" from tab1 as table1 …
Run Code Online (Sandbox Code Playgroud)