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

如何用SQLite查询各训练动作的最佳组记录?

获取SQLite中各训练动作的最佳组记录

方案一:使用窗口函数(推荐,SQLite 3.25.0+支持)

利用ROW_NUMBER()窗口函数按exerciseId分组,给每组内的记录按你的“最佳”规则排序并排名,取排名为1的记录即可:

WITH ranked_sets AS (
  SELECT *,
         ROW_NUMBER() OVER (
           PARTITION BY exerciseId 
           ORDER BY weight DESC, repCount DESC, completedAt ASC
         ) AS rn
  FROM Set
)
SELECT id, exerciseId, weight, repCount, completedAt
FROM ranked_sets
WHERE rn = 1;

说明:

  • PARTITION BY exerciseId:按训练动作ID分组
  • ORDER BY weight DESC, repCount DESC, completedAt ASC:和你单动作查询的排序规则一致,确保每组内排名第一的是符合要求的最佳组
  • 最后筛选rn = 1,得到每组的唯一最佳记录

方案二:关联子查询(兼容旧版SQLite)

如果你的SQLite版本不支持窗口函数,可以用关联子查询判断每条记录是否为同组内的最佳:

SELECT s1.*
FROM Set s1
WHERE NOT EXISTS (
  SELECT 1
  FROM Set s2
  WHERE s2.exerciseId = s1.exerciseId
    AND (
      s2.weight > s1.weight
      OR (s2.weight = s1.weight AND s2.repCount > s1.repCount)
      OR (s2.weight = s1.weight AND s2.repCount = s1.repCount AND s2.completedAt < s1.completedAt)
    )
);

说明:

  • 子查询会检查同exerciseId下是否存在比当前记录s1更优的记录s2
  • 如果不存在更优的记录,s1就是该组的最佳记录,逻辑完全匹配你定义的“最佳”规则

关于GROUP BY的说明

单纯使用GROUP BY exerciseId无法直接得到正确结果,因为SQLite在GROUP BY后选择非聚合列时,会返回分组内的任意一行,无法保证是按你指定规则排序后的第一条记录,因此需要结合窗口函数或子查询来实现需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:03:14