如何用SQL查询伦敦各酒店最常被预订的房型?
嘿,这个需求我太熟了!你现在的代码能算出每家酒店各房型的预订次数,接下来只要给每个酒店下的房型按预订量排个序,挑出排名第一的就行。下面给你两种实用的实现方式,适配不同的SQL环境:
方法一:用窗口函数(推荐,适合现代SQL数据库)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),这是最简洁高效的写法:
-- 第一步:统计伦敦每家酒店每个房型的预订次数 WITH RoomBookCounts AS ( SELECT h.hotelno, b.type, COUNT(*) AS book_count FROM bookings b JOIN hotels h ON b.hotelno = h.hotelno WHERE h.city = 'London' GROUP BY h.hotelno, b.type ), -- 第二步:给每家酒店的房型按预订量降序排名 RankedRooms AS ( SELECT hotelno, type, book_count, -- 按酒店分组,预订次数高的排前面 -- 若要保留并列最高的房型,把ROW_NUMBER换成RANK()/DENSE_RANK() ROW_NUMBER() OVER (PARTITION BY hotelno ORDER BY book_count DESC) AS rank_num FROM RoomBookCounts ) -- 第三步:筛选每家酒店排名第一的房型 SELECT hotelno, type AS most_booked_room_type, book_count AS total_bookings FROM RankedRooms WHERE rank_num = 1;
说明:
ROW_NUMBER():如果同一家酒店有多个房型预订量相同,只会返回其中一个(随机);RANK()/DENSE_RANK():如果有并列最高的房型,会全部返回,按需选择即可。
方法二:兼容老版本SQL的子查询写法
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用嵌套子查询实现:
SELECT rbc.hotelno, rbc.type AS most_booked_room_type, rbc.book_count AS total_bookings FROM ( -- 先统计各酒店各房型的预订次数 SELECT h.hotelno, b.type, COUNT(*) AS book_count FROM bookings b JOIN hotels h ON b.hotelno = h.hotelno WHERE h.city = 'London' GROUP BY h.hotelno, b.type ) rbc -- 关联每家酒店的最大预订次数,筛选出匹配的房型 INNER JOIN ( SELECT hotelno, MAX(book_count) AS max_book_count FROM ( SELECT h.hotelno, COUNT(*) AS book_count FROM bookings b JOIN hotels h ON b.hotelno = h.hotelno WHERE h.city = 'London' GROUP BY h.hotelno, b.type ) sub GROUP BY hotelno ) max_counts ON rbc.hotelno = max_counts.hotelno AND rbc.book_count = max_counts.max_book_count;
注意事项:
- 记得把代码里的
bookings(预订表)、hotels(酒店表)换成你实际使用的表名; - 确保
hotelno(酒店编号)、type(房型)是正确的分组字段,避免统计错误。
内容的提问来源于stack exchange,提问作者ZPC
相关产品推荐
相关产品推荐

