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

Oracle SQL如何查询每个BID对应最小MODIFIED日期的ID

需求实现方案

现有MY_TABLE表含ID、BID、MODIFIED三个字段,要获取每个BID对应MODIFIED日期最小的记录ID,可根据使用的数据库版本选择以下通用实现方式:

  • 方式一:关联子查询(全数据库兼容)
    通过子查询先拿到每个BID对应的最小MODIFIED值,再回联原表匹配得到对应ID,兼容所有主流SQL数据库。
SELECT t1.ID, t1.BID, t1.MODIFIED
FROM MY_TABLE t1
INNER JOIN (
    -- 原有已实现的分组查询逻辑
    SELECT BID, MIN(MODIFIED) AS min_modified
    FROM MY_TABLE
    GROUP BY BID
) t2 
ON t1.BID = t2.BID 
AND t1.MODIFIED = t2.min_modified;

注意:如果同一个BID下存在多条记录的MODIFIED值相同且均为最小值,以上语句会返回所有符合条件的ID,若需仅返回一条,可额外加筛选规则(如取最小ID)。

  • 方式二:窗口函数(支持MySQL 8.0+、PostgreSQL、SQL Server、Oracle等新数据库)
    使用排序窗口函数按BID分组后对MODIFIED升序排序,取排序第一的记录即可,写法更简洁。
SELECT ID, BID, MODIFIED
FROM (
    SELECT 
        ID, BID, MODIFIED,
        -- 按BID分组,MODIFIED升序排序生成序号
        ROW_NUMBER() OVER (PARTITION BY BID ORDER BY MODIFIED ASC) AS rn
    FROM MY_TABLE
) temp
WHERE rn = 1;

注意:如果需要保留同一个BID下所有MODIFIED为最小值的记录,将ROW_NUMBER()替换为RANK()即可。

  • 方式三:MySQL 5.x 快速实现(仅适合小数据量场景)
    利用GROUP_CONCAT排序后截取第一个ID,仅适合测试或小数据量场景,生产环境不推荐(GROUP_CONCAT有默认长度限制,数据量大会截断)。
SELECT 
    BID,
    SUBSTRING_INDEX(GROUP_CONCAT(ID ORDER BY MODIFIED ASC), ',', 1) AS target_id,
    MIN(MODIFIED) AS min_modified
FROM MY_TABLE
GROUP BY BID;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:45:03