You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从两个同结构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+支持)

这是最清晰可靠的写法,步骤分为三步:

  1. 用UNION ALL合并两个表的所有记录(不用UNION,避免自动去重丢失原始数据)
  2. 用窗口函数ROW_NUMBER()给每个ID的记录按时间降序排序,最新的记录会被标记为行号1
  3. 筛选出行号为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:52:10