我有一个时间刻度数据库的表TAB1,它有3列TAG、TIME、VALUE.时间和标签组成了表的主键:(时间,标签).
有500多万(50000,000)行.我需要找到最新的时间戳或最大(时间) for each N个标签.
以下是我try 过的几种方法,我将与大家分享我的经验:
- 内部查询
SELECT "time", "tag", "value"
FROM tab1
WHERE ("tag","time") IN
(SELECT "tag", MAX("time") FROM tab1 WHERE "tag" IN(tag1,tag2) GROUP BY "tag" );
这是给出的结果,但执行时间约为19秒,超出了可接受的限制
- 使用时间刻度数据库中的最后一个函数
SELECT tag, last(time, time), last(value,time)
FROM tab1
WHERE "tag" IN (tag1,tag2) GROUP BY "tag" ;
这是在10秒内输出的.
我需要找到另一个可行的解决方案,类似于第二个,可能表现更好.我try 了一些其他方法,如横向联接(3)、窗口函数(ROW_NUMBER,PARTITION)(4),但解决方案并不像预期的那样.
- 使用横向可以提供多个列的交叉,而不是像预期的那样具有最大时间的单个值.此外,它需要15秒才能执行,但可能是因为查询错误.
SELECT table1."tag", table1."time",table1."value" from tab1 as table1
join lateral (
SELECT table2 ."tag",table2 ."time" from tab1 as table2
where table2."tag" = table1."tag"
order by table2."time" desc limit 1
) p on true
where table1."tag" in (tag1,tag2)
- 在try 分区时,我想这样放limit 1:(Partition by Tag,Order by Time Desc Limit 1),但它给出了语法错误.如果没有限制1,我不会得到最新的时间.
SELECT * from
( SELECT *, row_number() over (partition by tag order by time desc) as rownum
from tab1) a
where tag in (tag1,tag2)
有没有人能建议3,4中的问题出了什么问题,或者是否还有其他 Select .