SQL*Plus技术求助:查询各车牌对应的最频繁驾驶司机
解决每个车牌对应最常驾驶驾驶员的SQL方案
嘿,我懂你要解决的问题——从包含重复车辆-驾驶员组合的表里,找出每个车牌对应的最常驾驶的驾驶员对吧?单纯用GROUP BY和COUNT()确实不够,因为分组计数后还得筛选出每个车牌组里计数最高的那一行,咱们来一步步实现:
方法一:用窗口函数(推荐,简洁高效)
Oracle 11g及以上版本支持窗口函数,这是最直观的写法,还能灵活处理并列情况:
场景1:每个车牌只取一个最常驾驶的驾驶员(若有并列随机选一个)
用ROW_NUMBER()给每个车牌分组内的驾驶员按驾驶次数降序编号,取编号为1的行:
WITH DriverCounts AS ( SELECT CAR_PLATE, DRIVER, COUNT(*) AS DRIVE_COUNT, -- 按车牌分组,驾驶次数降序排序,生成行号 ROW_NUMBER() OVER (PARTITION BY CAR_PLATE ORDER BY COUNT(*) DESC) AS rn FROM YOUR_TABLE_NAME -- 替换成你的实际表名 GROUP BY CAR_PLATE, DRIVER ) SELECT CAR_PLATE, DRIVER, DRIVE_COUNT FROM DriverCounts WHERE rn = 1;
场景2:保留并列的最常驾驶驾驶员(若多个驾驶员次数相同都显示)
如果需要把驾驶次数相同的驾驶员都列出来,换成RANK()函数即可:
WITH DriverCounts AS ( SELECT CAR_PLATE, DRIVER, COUNT(*) AS DRIVE_COUNT, -- 并列的行会得到相同排名 RANK() OVER (PARTITION BY CAR_PLATE ORDER BY COUNT(*) DESC) AS rnk FROM YOUR_TABLE_NAME -- 替换成你的实际表名 GROUP BY CAR_PLATE, DRIVER ) SELECT CAR_PLATE, DRIVER, DRIVE_COUNT FROM DriverCounts WHERE rnk = 1;
方法二:兼容旧版本Oracle(无窗口函数支持)
如果你的Oracle版本比较老(比如10g及以下),可以用子查询嵌套的方式实现:
SELECT dc.CAR_PLATE, dc.DRIVER, dc.DRIVE_COUNT FROM ( -- 先统计每个车牌-驾驶员组合的驾驶次数 SELECT CAR_PLATE, DRIVER, COUNT(*) AS DRIVE_COUNT FROM YOUR_TABLE_NAME GROUP BY CAR_PLATE, DRIVER ) dc WHERE -- 筛选出当前车牌中驾驶次数等于最大值的记录 dc.DRIVE_COUNT = ( SELECT MAX(inner_dc.DRIVE_COUNT) FROM ( SELECT CAR_PLATE, COUNT(*) AS DRIVE_COUNT FROM YOUR_TABLE_NAME GROUP BY CAR_PLATE, DRIVER ) inner_dc WHERE inner_dc.CAR_PLATE = dc.CAR_PLATE );
注意事项
- 记得把
YOUR_TABLE_NAME替换成你实际的表名; - 如果表中有
NULL值(比如车牌或驾驶员为空),可以根据需求在WHERE子句里过滤掉,比如WHERE CAR_PLATE IS NOT NULL AND DRIVER IS NOT NULL; - SQL*Plus完全支持以上语法,执行时直接复制替换后运行即可。
内容的提问来源于stack exchange,提问作者daniqt2
相关产品推荐
相关产品推荐

