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

SQLite中如何为每个外键选取对应的最新单条记录

为SQLite中每个x_fk获取最新评分记录的解决方案

针对你的需求,这里提供几种可靠的实现方式:

方法一:分组子查询关联(兼容所有SQLite版本)

利用自增主键y_pk的唯一性是最稳妥的方式(避免同一x_fk在同一时间有多条评分的情况):

SELECT y.*
FROM y
INNER JOIN (
    SELECT x_fk, MAX(y_pk) AS latest_pk
    FROM y
    GROUP BY x_fk
) AS latest_y ON y.y_pk = latest_y.latest_pk;

如果更依赖date字段判断最新,也可以用MAX(date)替代MAX(y_pk),但注意若同一x_fk在同一时间有多个评分,会返回多条匹配记录:

SELECT y.*
FROM y
INNER JOIN (
    SELECT x_fk, MAX(date) AS latest_date
    FROM y
    GROUP BY x_fk
) AS latest_y ON y.x_fk = latest_y.x_fk AND y.date = latest_y.latest_date;

方法二:窗口函数(SQLite 3.25.0及以上版本支持)

窗口函数写法逻辑更直观,能灵活定义排序规则,确保每个x_fk仅返回一条最新记录:

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY x_fk ORDER BY date DESC, y_pk DESC) AS rn
    FROM y
) AS ranked_y
WHERE rn = 1;

这里通过PARTITION BY x_fk按x_fk分组,ORDER BY date DESC, y_pk DESC确保先按日期倒序排列,日期相同时取主键更大的记录,最后筛选出每个分组的第一条数据(rn=1)。

关联表x获取完整信息

如果需要同时展示表x中项的名称,可用LEFT JOIN关联,确保即使x表中的项没有评分记录也能被列出:

SELECT x.x_pk, x.name, y.rating, y.date
FROM x
LEFT JOIN (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY x_fk ORDER BY date DESC, y_pk DESC) AS rn
    FROM y
) AS ranked_y ON x.x_pk = ranked_y.x_fk AND ranked_y.rn = 1;

内容的提问来源于stack exchange,提问作者Ivo Treszka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:45:06