SQLite查询:如何按自定义ID范围筛选各区间最大ID记录?
当然可以实现!
这种按自定义ID区间筛选并取每个区间最大值的需求,用标准SQL就能轻松搞定,而且完全支持灵活修改区间范围。下面给你两种实用的方案:
方案1:用CASE语句直接定义区间(适合区间较少的场景)
这种方式直接在查询里通过CASE把每个ID映射到对应的区间,然后分组取最大值:
WITH grouped_data AS ( SELECT date, id, CASE WHEN id BETWEEN 1 AND 10 THEN '1-10' WHEN id BETWEEN 11 AND 20 THEN '11-20' WHEN id BETWEEN 21 AND 30 THEN '21-30' -- 这里可以按需添加更多区间,比如 WHEN id BETWEEN 31 AND 40 THEN '31-40' END AS id_range FROM your_table ) SELECT date, MAX(id) AS max_id FROM grouped_data WHERE id_range IS NOT NULL -- 过滤掉不在我们定义区间内的记录 GROUP BY date, id_range ORDER BY id_range;
效果说明:
用你提供的测试数据执行这个查询,会得到你预期的结果:
date | max_id ------------|------- unixtime_1 | 9 unixtime_1 | 29
因为11-20区间没有匹配的ID,所以自动被跳过了。要修改区间的话,直接修改CASE里的条件即可。
方案2:用CTE存储区间(适合区间频繁修改的场景)
如果你的ID区间需要经常调整,把区间单独放在一个CTE(临时表)里会更灵活,修改时只需要调整这部分内容,不用动主查询逻辑:
-- 第一步:定义所有需要的ID区间,这里可以随意增删改 WITH id_ranges AS ( SELECT 1 AS start_range, 10 AS end_range UNION ALL SELECT 11, 20 UNION ALL SELECT 21, 30 -- 比如要加新区间,直接加一行 SELECT 31, 40 UNION ALL 就行 ), -- 第二步:把原表数据和区间关联,找到每个ID所属的区间 matched_data AS ( SELECT t.date, t.id, r.start_range, r.end_range FROM your_table t JOIN id_ranges r ON t.id BETWEEN r.start_range AND r.end_range ) -- 第三步:按日期和区间分组,取每个组的最大ID SELECT date, MAX(id) AS max_id FROM matched_data GROUP BY date, start_range, end_range ORDER BY start_range;
优势:
这种方式的灵活性更强,比如你要新增31-40区间,只需要在id_ranges里加一行即可,主查询逻辑完全不用改。而且这种写法几乎兼容所有主流数据库(MySQL、PostgreSQL、SQL Server等)。
内容的提问来源于stack exchange,提问作者Soul
相关产品推荐
相关产品推荐

