SQL查询如何选取指定字段为最小值的所有匹配行
解决方案
要获取查询结果中SORT_ORDER为最小值对应的所有行,无需提前预知最小值具体数值,以下两种写法均适配需求,可根据使用的数据库版本选择:
子查询匹配最小值(通用写法,兼容所有SQL数据库)
通过子查询先计算当前筛选条件下的最小SORT_ORDER值,再匹配所有等于该值的记录,逻辑直观易维护:
SELECT * FROM R_EXPORT_RU R_EXPORT_RU INNER JOIN TABLE_TEMP_1 TT ON TT.RU_LVL = R_EXPORT_RU.RU_LVL_ID WHERE PER_ID = 12345 AND TT.SORT_ORDER = ( SELECT MIN(TT_SUB.SORT_ORDER) FROM R_EXPORT_RU R_SUB INNER JOIN TABLE_TEMP_1 TT_SUB ON TT_SUB.RU_LVL = R_SUB.RU_LVL_ID WHERE R_SUB.PER_ID = 12345 ) ORDER BY TT.SORT_ORDER;
该写法会自动匹配当前查询条件下的最小排序值,无论最小值是1还是4,都会返回所有对应该值的记录,和示例中需要返回2条SORT_ORDER=4数据的需求完全匹配。
窗口函数写法(适配支持窗口函数的数据库:MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)
如果使用的是新版本支持窗口函数的数据库,可以用RANK()函数简化写法,避免重复编写关联和筛选逻辑:
SELECT * FROM ( SELECT *, RANK() OVER (ORDER BY TT.SORT_ORDER) AS sort_rank FROM R_EXPORT_RU R_EXPORT_RU INNER JOIN TABLE_TEMP_1 TT ON TT.RU_LVL = R_EXPORT_RU.RU_LVL_ID WHERE PER_ID = 12345 ) ranked_res WHERE sort_rank = 1;
RANK()函数会按照SORT_ORDER升序为所有记录打排名,排序值相同的记录会得到相同的排名,最终筛选排名为1的结果即可。
注意:不要用
ROW_NUMBER()替代RANK(),ROW_NUMBER()会为排序值相同的记录生成不重复的连续序号,会导致同属最小SORT_ORDER的记录被错误过滤。
内容的提问来源于stack exchange,提问作者McGlone
相关产品推荐
相关产品推荐

