如何使用SQL查询bookings表总入住人数第二高的所有对应日期
查询总预订床位数第二高的所有日期SQL实现
以下代码为标准SQL语法,兼容MySQL 8.0+、PostgreSQL、SQL Server等主流数据库:
WITH daily_total AS ( -- 按日期聚合计算每天的总入住人数 SELECT DATE(timestampOfBooking) AS booking_date, SUM(numberOfGuests) AS total_guests FROM bookings GROUP BY DATE(timestampOfBooking) ), second_highest AS ( -- 提取去重后总人数排名第二的数值 SELECT DISTINCT total_guests FROM daily_total ORDER BY total_guests DESC LIMIT 1 OFFSET 1 ) -- 返回所有符合条件的日期 SELECT booking_date AS dates FROM daily_total WHERE total_guests = (SELECT total_guests FROM second_highest);
逻辑说明
- 如果
timestampOfBooking本身就是日期类型,可去掉DATE()函数直接分组;不同数据库的日期转换函数存在差异时,可替换为对应语法,例如SQL Server替换为CAST(timestampOfBooking AS DATE) - 当所有日期的总入住人数完全相同时,去重后的总人数列表只有1个值,
OFFSET 1会返回空,最终查询结果自然为空,符合需求要求 - 多个日期总人数同时等于第二高值时,会全部返回,无遗漏
样例验证
对应给出的测试数据:
- 各日期总入住人数分别为:22/11/2021为2,23/11/2021为7,24/11/2021为7,25/11/2021为17
- 去重后总人数降序排序为17、7、2,取到的第二高值为7
- 最终返回23/11/2021、24/11/2021两个日期,和预期结果完全一致
内容的提问来源于stack exchange,提问作者Davin Vroegop
相关产品推荐
相关产品推荐

