sql - SQLITE:获取每个不同组件的最后一个组件更新
问题描述
我有一个看起来有点像这样的简单 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 有大约一千个 DISTINCT 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 内容结束。
任何帮助表示赞赏。
(明天)
作为对此的更新 - 无论如何对我来说 - 当表中的行数低于 200,000 时,获取所有不同 tid 然后 foreach tid 获取其最后一次更新的基本方法更快(.5s),一旦超过运行时飙升进入许多秒后,第 3 种方式变得更加有用,因为虽然运行了 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;
推荐阅读
- python - 注释点图
- vb.net - 运行已发布的 .exe 时出现错误消息“无法加载类型‘System.ComponentModel.AsyncCompletedEventArgs’”
- java - java - 如何在没有withColumn的情况下将Spark Dataset的所有列转换为Java中的String?
- arduino - 无法将数据从 nodeMCU-8266 发送到本地主机(数据库)
- awk - awk, sed 命令从 lftp 日志文件中提取文件名
- python - 将子文件夹名称与文件名和输出文件夹 python 匹配
- excel - 在第一个活动单元格中应用公式的宏
- python - 如何将行值与另一个熊猫数据框中的组值总和进行比较?
- tensorflow - 如何使用 Keras Lambda 层修复类型错误
- sapui5 - 一起使用控制器和视图