SQL技术求助:获取特定列值较小的行及COUNT最小值对应表
解决获取COUNT值最小记录的SQL方案
嘿,我来帮你搞定这个问题!要找出COUNT(Problem.Solver_Assigned_ID)最小的记录,其实有几种靠谱的方法,你可以根据自己使用的数据库类型来选择合适的方案:
方法1:子查询匹配最小COUNT值
如果你的需求是找出所有分组中COUNT值等于最小值的记录(包括并列情况),可以用嵌套子查询先拿到最小的统计值,再筛选匹配的结果。假设你是按某个字段(比如Solver_ID)分组统计的,示例代码如下:
SELECT Solver_ID, COUNT(Problem.Solver_Assigned_ID) AS assigned_count FROM Problem -- 如果有其他过滤条件,可以在这里加WHERE子句 GROUP BY Solver_ID HAVING COUNT(Problem.Solver_Assigned_ID) = ( SELECT MIN(assigned_count) FROM ( SELECT COUNT(Solver_Assigned_ID) AS assigned_count FROM Problem -- 这里要和主查询的WHERE条件保持一致 GROUP BY Solver_ID ) AS sub_stats );
说明:内层子查询先计算每个分组的统计值,外层子查询提取其中的最小值,最后主查询筛选出统计值等于这个最小值的所有分组。
方法2:窗口函数(支持窗口函数的数据库适用)
如果你的数据库支持窗口函数(比如PostgreSQL、SQL Server、MySQL 8.0+),用RANK()或ROW_NUMBER()会更灵活:
WITH counted_groups AS ( SELECT Solver_ID, COUNT(Solver_Assigned_ID) AS assigned_count, -- RANK()会保留并列的最小值记录,ROW_NUMBER()只会取一条 RANK() OVER (ORDER BY COUNT(Solver_Assigned_ID) ASC) AS rank_num FROM Problem GROUP BY Solver_ID ) SELECT Solver_ID, assigned_count FROM counted_groups WHERE rank_num = 1;
说明:用CTE先给每个分组的统计值排名,排名为1的就是COUNT最小的记录,RANK()会把所有并列第一的都返回,适合需要所有最小记录的场景。
方法3:ORDER BY + LIMIT(快速取单条最小记录)
如果只需要任意一条COUNT值最小的记录,且数据库支持LIMIT(比如MySQL、PostgreSQL),可以用最简单的排序加限制:
SELECT Solver_ID, COUNT(Problem.Solver_Assigned_ID) AS assigned_count FROM Problem GROUP BY Solver_ID ORDER BY assigned_count ASC LIMIT 1;
注意:这个方法只会返回一条记录,如果有多个分组的COUNT值相同且都是最小值,只会拿到其中一个,适合不需要并列结果的场景。
你可以根据自己的实际查询场景(比如是否有过滤条件、是否需要并列结果、数据库类型)调整上述代码中的字段和条件哦!
内容的提问来源于stack exchange,提问作者Jon Goe
相关产品推荐
相关产品推荐

