You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:47:26