SQLITE:获取每个不同组件的最后一个组件更新
SQLITE: get last component update for each distinct component
我有一个简单的 SQLITE 数据库,看起来有点像这样
ID TID LASTUPDATE UPDATE
============================================
1 213 2020-09-09 ok
2 416 2019-12-25 ok
3 213 2020-11-10 meh
...
999999 899 2020-12-11 bad
大约有上千个不同的 TID,每个 TID 都有数十万个更新。
我想获得每个不同 TID 的最后更新,而不管它是何时制作的,我想一次性完成。我不想获取所有不同的 TID,然后为每个 TID 获取其 UPDATE 和 LASTUPDATE
像“SELECT * FROM updates GROUP BY TID”之类的东西不会起作用,因为 GROUP BY 会给出它找到的第一个 TID,而我想要它找到的最后一个,所以我不想这个:
1 213 2020-09-09 ok
2 416 2019-12-25 ok
...
当我想要的时候(实际上,排序并不重要)
3 213 2020-11-10 meh
2 416 2019-12-25 ok
...
不幸的是,我对 SQL 的了解只限于简单的 CRUD 内容。
感谢任何帮助。
(第二天)
作为对此的更新 - 无论如何对我来说 - 当 table 中的数字行低于一旦超过 200,000,运行 时间就会飙升到许多秒,第三种方式变得更加有用,因为尽管 运行 需要 2.5 秒,但它似乎是一个常数 运行 时间似乎没有太大变化。
我也无法使用第二个版本,但进行了一些编辑
select t.*
from updates t join
(select id, tid, max(t.lastupdate) as max_lastupdate from updates t group by vid) tt
on t.id = tt.id and (t.lastupdate = tt.max_lastupdate);
我发现它的运行时间总是在 250 毫秒左右,这两个版本的性能很容易超过。
非常感谢 Gordon Linoff,非常感谢您抽出宝贵的时间。
一种方法使用相关子查询:
select t.*
from t
where t.lastupdate = (select max(t2.lastupdate) from t t2 where t2.tid = t.tid);
为了性能,您需要 (tid, lastupdate)
上的索引。
您也可以尝试将其表述为:
select t.*
from t join
(select tid, max(t2.lastupdate) as max_lastupdate
from t
group by tid
) tt
on t.id = tt.id and t.lastupdate = tt.max_lastupdate;
或者:
select t.*
from (select t.*,
row_number() over (partition by tid order by lastupdate desc) as seqnum
from t
) t
where seqnum = 1;
我有一个简单的 SQLITE 数据库,看起来有点像这样
ID TID LASTUPDATE UPDATE
============================================
1 213 2020-09-09 ok
2 416 2019-12-25 ok
3 213 2020-11-10 meh
...
999999 899 2020-12-11 bad
大约有上千个不同的 TID,每个 TID 都有数十万个更新。
我想获得每个不同 TID 的最后更新,而不管它是何时制作的,我想一次性完成。我不想获取所有不同的 TID,然后为每个 TID 获取其 UPDATE 和 LASTUPDATE
像“SELECT * FROM updates GROUP BY TID”之类的东西不会起作用,因为 GROUP BY 会给出它找到的第一个 TID,而我想要它找到的最后一个,所以我不想这个:
1 213 2020-09-09 ok
2 416 2019-12-25 ok
...
当我想要的时候(实际上,排序并不重要)
3 213 2020-11-10 meh
2 416 2019-12-25 ok
...
不幸的是,我对 SQL 的了解只限于简单的 CRUD 内容。
感谢任何帮助。
(第二天)
作为对此的更新 - 无论如何对我来说 - 当 table 中的数字行低于一旦超过 200,000,运行 时间就会飙升到许多秒,第三种方式变得更加有用,因为尽管 运行 需要 2.5 秒,但它似乎是一个常数 运行 时间似乎没有太大变化。
我也无法使用第二个版本,但进行了一些编辑
select t.*
from updates t join
(select id, tid, max(t.lastupdate) as max_lastupdate from updates t group by vid) tt
on t.id = tt.id and (t.lastupdate = tt.max_lastupdate);
我发现它的运行时间总是在 250 毫秒左右,这两个版本的性能很容易超过。
非常感谢 Gordon Linoff,非常感谢您抽出宝贵的时间。
一种方法使用相关子查询:
select t.*
from t
where t.lastupdate = (select max(t2.lastupdate) from t t2 where t2.tid = t.tid);
为了性能,您需要 (tid, lastupdate)
上的索引。
您也可以尝试将其表述为:
select t.*
from t join
(select tid, max(t2.lastupdate) as max_lastupdate
from t
group by tid
) tt
on t.id = tt.id and t.lastupdate = tt.max_lastupdate;
或者:
select t.*
from (select t.*,
row_number() over (partition by tid order by lastupdate desc) as seqnum
from t
) t
where seqnum = 1;