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

