SQLite3查询中如何选取指定数量最新唯一日期的全部数据行
解决SQLite获取最新7个日期所有数据行的问题
嘿,我懂你遇到的问题了!你之前用LIMIT 7的写法,本质是告诉SQL返回最多7行数据,而不是「最新7个日期对应的全部数据」——这就是为什么每个日期只拿到了1行,因为排序后前7行刚好是每个日期的第一行。
要实现你的需求,核心思路是:先筛选出需要的7个日期,再把原表中所有属于这些日期的数据都捞出来。下面是具体的解决方案:
方法一:用子查询筛选日期
先通过子查询拿到最新的7个唯一日期,再在外层查询中匹配这些日期的所有记录:
SELECT date, application, usage_time FROM monitor WHERE date IN ( -- 先获取最新的7个日期 SELECT DISTINCT date FROM monitor ORDER BY date DESC LIMIT 7 ) -- 保持你需要的排序规则 ORDER BY date DESC, usage_time ASC;
方法二:用WITH子句提升可读性(SQLite 3.33.0+)
如果你的SQLite版本在3.33.0及以上,可以用CTE(公共表表达式)让代码结构更清晰:
WITH latest_7_dates AS ( SELECT DISTINCT date FROM monitor ORDER BY date DESC LIMIT 7 ) SELECT date, application, usage_time FROM monitor JOIN latest_7_dates USING(date) ORDER BY date DESC, usage_time ASC;
额外提示
你原来的Python代码里用了sorted(),但其实SQL查询已经通过ORDER BY完成了排序,除非你需要在Python层面做特殊的二次排序,否则可以去掉这个sorted(),避免重复排序浪费性能。修改后的Python代码可以是:
all_app_data = conn.execute(''' SELECT date, application, usage_time FROM monitor WHERE date IN ( SELECT DISTINCT date FROM monitor ORDER BY date DESC LIMIT 7 ) ORDER BY date DESC, usage_time ASC ''').fetchall()
这样就能拿到2021年7月30日至8月5日这7个日期下的所有数据行啦!
内容的提问来源于stack exchange,提问作者Angad_K
相关产品推荐
相关产品推荐

