如何获取每个carID对应的numClients最大值的SQL技术问询
解决每个carID对应最大numClients的问题
看起来你已经搞定了第一步——统计出每个客户对应每辆车的租赁次数,现在要进一步找出每辆车被单个客户租赁次数最多的记录对吧?我给你两种实用的解决方案,你可以根据需求选择:
方法一:用窗口函数(推荐,简洁灵活)
窗口函数能帮你快速给每个carID分组里的记录按租赁次数排序,直接筛选出排名第一的记录。如果有多个客户对同一辆车的租赁次数并列最高,还可以灵活调整是否保留所有并列记录:
WITH client_car_rent_counts AS ( -- 复用你原来的统计逻辑,得到每个carID+clientID的租赁次数 SELECT carID, clientID, COUNT(*) AS numClients FROM RENT R JOIN DETAILS_OF_RENT D ON d.rentID = r.ID GROUP BY carID, clientID ) SELECT carID, clientID, numClients FROM ( SELECT *, -- 按carID分组,每组内按numClients降序排,给每条记录标排名 ROW_NUMBER() OVER (PARTITION BY carID ORDER BY numClients DESC) AS rn FROM client_car_rent_counts ) t WHERE rn = 1;
- 如果你只需要每个carID下任意一条最大租赁次数的记录,用
ROW_NUMBER()就好; - 如果想保留所有并列最大值的记录(比如同一辆车有两个客户都租了5次,都是最大值),把
ROW_NUMBER()换成RANK()就行。
方法二:用子查询关联
这种方法逻辑更直观,先找出每个carID的最大租赁次数,再关联回原统计结果找到对应的客户:
-- 第一步:统计每个carID+clientID的租赁次数 WITH client_car_rent_counts AS ( SELECT carID, clientID, COUNT(*) AS numClients FROM RENT R JOIN DETAILS_OF_RENT D ON d.rentID = r.ID GROUP BY carID, clientID ), -- 第二步:找出每个carID对应的最大租赁次数 max_rent_per_car AS ( SELECT carID, MAX(numClients) AS max_numClients FROM client_car_rent_counts GROUP BY carID ) -- 第三步:关联两个结果,得到每个carID下租赁次数等于最大值的记录 SELECT c.carID, c.clientID, c.numClients FROM client_car_rent_counts c JOIN max_rent_per_car m ON c.carID = m.carID AND c.numClients = m.max_numClients;
这个方法默认会保留所有并列最大值的记录,适合你需要查看所有达到最高租赁次数的客户场景。
内容的提问来源于stack exchange,提问作者K O K I T A S
相关产品推荐
相关产品推荐

