如何使用SQL min函数子查询查找trip_no数量最少的公司名称
原SQL错误原因
- 你写的SQL里
min()函数的入参是一个返回两列的子查询,语法不合法,min只能对单列数值集合求最小值。
正确查询方案
下面分两种常用实现,均支持返回多个并列最少trip_no数量的公司:
写法1:全数据库版本兼容写法
适用于所有支持标准SQL的数据库,逻辑是先统计每个公司的trip_no数量,再取最小的统计值作为过滤条件:
SELECT t1.Id_comp, company.name, COUNT(t1.trip_no) AS trip_count FROM trip t1 INNER JOIN company ON t1.ID_comp = company.ID_comp GROUP BY t1.Id_comp, company.name HAVING COUNT(t1.trip_no) = ( -- 先求所有公司的trip_no数量的最小值 SELECT MIN(trip_cnt) FROM ( SELECT COUNT(t2.trip_no) AS trip_cnt FROM trip t2 GROUP BY t2.ID_comp ) AS company_trip_cnt )
写法2:窗口函数写法(适配MySQL8.0+/PostgreSQL/SQL Server等新数据库)
用RANK窗口函数排序,写法更简洁,并列最小值的处理逻辑更直观:
WITH company_trip_stat AS ( SELECT t.Id_comp, c.name AS company_name, COUNT(t.trip_no) AS trip_count, -- 按trip数量升序排序,排名相同的rk值一致 RANK() OVER(ORDER BY COUNT(t.trip_no) ASC) AS rk FROM trip t INNER JOIN company c ON t.ID_comp = c.ID_comp GROUP BY t.Id_comp, c.name ) -- 取排名第一的就是trip数量最少的公司 SELECT Id_comp, company_name, trip_count FROM company_trip_stat WHERE rk = 1
内容的提问来源于stack exchange,提问作者Nune Tadevosyan
相关产品推荐
相关产品推荐

