如何编写SQL查询采购总量排名第二的国家
现有SQL的问题
- 未按国家维度聚合采购总量,直接按单条订单明细的采购量排序,输出结果不是国家维度的采购总量排名
- 仅通过
limit 2返回前2条结果,无法单独筛选出排名第二的国家
基础实现方案(无并列排名场景)
适用于不存在多个国家采购总量相同的场景,改动后代码如下:
SELECT c.country FROM Customers c JOIN Orders o ON c.customerid = o.customerid JOIN OrderDetails od ON o.orderid = od.orderid GROUP BY c.country ORDER BY SUM(od.quantity) DESC LIMIT 1 OFFSET 1
改动说明:
- 新增
GROUP BY c.country按国家分组,用SUM(od.quantity)统计每个国家的总采购量 - 排序逻辑调整为按汇总后的总采购量倒序排列
- 用
LIMIT 1 OFFSET 1跳过排名第一的结果,仅返回排名第二的1条数据
进阶实现方案(支持并列排名场景)
如果需要处理多个国家采购总量相同、并列排名的情况,使用DENSE_RANK窗口函数实现更准确的排名匹配:
WITH country_purchase AS ( SELECT c.country, SUM(od.quantity) total_quantity, DENSE_RANK() OVER(ORDER BY SUM(od.quantity) DESC) AS purchase_rank FROM Customers c JOIN Orders o ON c.customerid = o.customerid JOIN OrderDetails od ON o.orderid = od.orderid GROUP BY c.country ) SELECT country FROM country_purchase WHERE purchase_rank = 2
该方案的优势是如果存在多个国家并列采购量第一,DENSE_RANK会把下一个采购量级的国家正确标记为第2名,不会出现排名跳空的问题。
内容的提问来源于stack exchange,提问作者Pranav Kadu
相关产品推荐
相关产品推荐

