SQL查询:如何根据一列的最大值选取另一列的对应值
SQL实现方案
直接按统计得到的tin_值倒序排序后取第一条,即可拿到tin_取最大值时对应的tin_max,代码如下:
SELECT n.tin_max FROM ( SELECT DISTINCT tin AS tin_max, nome_cat FROM responsavel_por GROUP BY tin, nome_cat ) AS n GROUP BY tin_max ORDER BY COUNT(n.tin_max) DESC LIMIT 1;
注意事项
- 原SQL子查询中的
ORDER BY tin是冗余逻辑,子查询内的排序会在外层分组聚合时失效,删除后不影响结果,还能减少不必要的排序开销;原句中子查询层对responsavel_por.tin的计数不影响外层统计结果,已在优化版本中移除。 - 若你使用的数据库不支持
LIMIT语法(如SQL Server需用TOP 1、Oracle 11g及更早版本需用ROWNUM取数),只需替换末尾取首行的语法即可,核心排序逻辑无需调整。 - 如果存在多个
tin_max对应相同最大tin_值、需要返回全部符合条件结果的场景,可以用窗口函数实现:
WITH tin_stat AS ( SELECT tin_max, COUNT(*) AS tin_ FROM ( SELECT DISTINCT tin AS tin_max, nome_cat FROM responsavel_por GROUP BY tin, nome_cat ) t GROUP BY tin_max ) SELECT tin_max FROM ( SELECT tin_max, RANK() OVER(ORDER BY tin_ DESC) AS rk FROM tin_stat ) res WHERE rk = 1;
内容的提问来源于stack exchange,提问作者ak3
相关产品推荐
相关产品推荐

