Oracle中查询图书租赁量最高月份及对应数量的SQL问题求助
解决图书租赁量最高月份及对应数量的SQL整合问题
嘿,我懂你现在的困扰——想把最高租赁量的月份和对应的数量放在同一张结果里对吧?其实不用分开写两个查询,咱们可以把逻辑整合在一起,给你两种靠谱的方案:
方案一:嵌套子查询实现
直接在HAVING子句里先计算出所有月份的租赁量最大值,然后筛选出等于这个值的月份和对应数量:
SELECT TO_CHAR(rental_start_date, 'MON') AS rental_month, COUNT(book_id) AS rental_count FROM bookrental.book_rental GROUP BY TO_CHAR(rental_start_date, 'MON') HAVING COUNT(book_id) = ( -- 先通过内层子查询算出每个月的租赁量,再取最大值 SELECT MAX(rental_count) FROM ( SELECT COUNT(book_id) AS rental_count FROM bookrental.book_rental GROUP BY TO_CHAR(rental_start_date, 'MON') ) AS monthly_rentals );
这个查询的逻辑是:内层子查询先生成每个月的租赁统计,然后外层子查询拿到最大的那个数值,最后主查询筛选出租赁量等于这个最大值的月份和数量,就能一次性得到你要的结果了。
方案二:窗口函数(更灵活)
如果担心有多个月份租赁量并列最高的情况,用窗口函数RANK()会更合适,它会保留所有并列第一的记录:
-- 先通过CTE计算每个月的租赁量和排名 WITH monthly_rentals AS ( SELECT TO_CHAR(rental_start_date, 'MON') AS rental_month, COUNT(book_id) AS rental_count, -- 按租赁量降序排名,最高的排第1 RANK() OVER (ORDER BY COUNT(book_id) DESC) AS rental_rank FROM bookrental.book_rental GROUP BY TO_CHAR(rental_start_date, 'MON') ) -- 筛选出排名第1的记录 SELECT rental_month, rental_count FROM monthly_rentals WHERE rental_rank = 1;
要是你只需要任意一个最高租赁量的月份(哪怕有并列),可以把RANK()换成ROW_NUMBER(),不过一般来说RANK()更符合业务需求,毕竟可能存在多个月份租赁量相同的情况。
这两种方法都能帮你把月份和对应的最高租赁量放在同一张结果表里,你可以根据自己的场景选合适的~
内容的提问来源于stack exchange,提问作者17tucs146 Ragul
相关产品推荐
相关产品推荐

