如何从两个同结构SQLite表中按日期时间取唯一ID的最新记录?
解决跨两表获取每个ID最新记录的问题
嘿,我来帮你搞定这个需求!首先得提一句,你给出的单表查询语句其实有坑:SELECT DISTINCT ID, Image FROM TableA GROUP BY ID ORDER BY Date DESC, Time DESC LIMIT 5 里,GROUP BY ID 后直接取Image是不可靠的——SQLite虽然允许这种非标准写法,但返回的Image并不一定对应最新的Date和Time,结果完全是随机的。
回到跨两表的需求,我们可以通过合并数据 + 排序筛选的方式实现,具体方案如下:
方案1:用窗口函数(推荐,SQLite 3.25.0+支持)
这是最清晰可靠的写法,步骤分为三步:
- 用
UNION ALL合并两个表的所有记录(不用UNION,避免自动去重丢失原始数据) - 用窗口函数
ROW_NUMBER()给每个ID的记录按时间降序排序,最新的记录会被标记为行号1 - 筛选出行号为1的记录,就是目标结果
完整SQL语句:
SELECT ID, Image, Date, Time FROM ( SELECT ID, Image, Date, Time, -- 按ID分组,时间倒序排,最新的记录rn=1 ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY Date DESC, Time DESC ) AS rn FROM ( SELECT ID, Image, Date, Time FROM TableA UNION ALL SELECT ID, Image, Date, Time FROM TableB ) AS combined_tables ) AS ranked_tables WHERE rn = 1;
方案2:兼容旧版SQLite(不支持窗口函数时用)
如果你的SQLite版本低于3.25.0,不能用窗口函数,可以用子查询的方式实现:
SELECT c.ID, c.Image, c.Date, c.Time FROM ( SELECT ID, Image, Date, Time FROM TableA UNION ALL SELECT ID, Image, Date, Time FROM TableB ) AS c -- 筛选出当前ID下时间最新的记录 WHERE (c.Date, c.Time) = ( SELECT MAX(Date), MAX(Time) FROM ( SELECT ID, Date, Time FROM TableA UNION ALL SELECT ID, Date, Time FROM TableB ) AS t WHERE t.ID = c.ID );
这个写法的逻辑是:对合并后的每条记录,判断它的Date和Time是否是对应ID的最大时间组合,符合条件的就是我们要的最新记录。
内容的提问来源于stack exchange,提问作者StereoMatching
相关产品推荐
相关产品推荐

