SQL实现:查询每个客户下提交工单最多的前2名人员及错误修正
问题解决:获取每个客户工单提交量前2的人员
原始SQL的错误分析
count()语法错误:count函数必须传入参数,比如count(*)(统计所有行)或count(TicketNo)(统计非空的工单编号)- 分组字段错误:表中不存在
CUSTOMER_NAME字段,正确字段是Customer;同时SELECT子句包含Customer和Person,GROUP BY必须同时包含这两个字段,否则不符合SQL分组规则
正确SQL实现
我们可以使用窗口函数对每个客户下的人员工单数量进行排名,筛选出排名前2的记录:
方法1:严格取前2(并列仅保留一条)
使用ROW_NUMBER(),即使有人员工单数量并列,也只会按顺序保留一条:
WITH TicketCounts AS ( SELECT Customer, Person, COUNT(TicketNo) AS TicketCount, ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY COUNT(TicketNo) DESC) AS Rank FROM Tickets GROUP BY Customer, Person ) SELECT Customer, Person, TicketCount FROM TicketCounts WHERE Rank <= 2;
方法2:保留并列排名的所有记录
使用RANK(),如果有多个人员工单数量并列且排名在前2范围内,会全部返回:
WITH TicketCounts AS ( SELECT Customer, Person, COUNT(TicketNo) AS TicketCount, RANK() OVER (PARTITION BY Customer ORDER BY COUNT(TicketNo) DESC) AS Rank FROM Tickets GROUP BY Customer, Person ) SELECT Customer, Person, TicketCount FROM TicketCounts WHERE Rank <= 2;
测试结果
针对提供的测试数据,执行后会得到:
| Customer | Person | TicketCount |
|---|---|---|
| JoeTrading | Bob | 2 |
| JoeTrading | Gemma | 2 |
| SmallShop | Jimmy | 2 |
| BigSupplies | Jane | 5 |
注:SmallShop和BigSupplies仅有一名提交人员,因此仅返回对应记录。
内容的提问来源于stack exchange,提问作者Rob Cross
相关产品推荐
相关产品推荐

