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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:03:22