如何用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
相关产品推荐
相关产品推荐

