力扣603(MySQL)-连续空余座位(简单)
题目:
几个朋友来到电影院的售票处,准备预约连续空余座位。
你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗?
对于如上样例,你的查询语句应该返回如下结果。
注意:
seat_id 字段是一个自增的整数,free 字段是布尔类型(‘1’ 表示空余, ‘0’ 表示已被占据)。
连续空余座位的定义是大于等于 2 个连续空余的座位。
解题思路:
建表语句:
1 create table if not EXISTS cinema_603 (seat_id int(3),free tinyint(1)); 2 TRUNCATE table cinema_603; 3 insert into cinema_603 values(1,1),(2,0),(3,1),(4,1),(5,1);
这题与前面的 力扣601-体育馆的人的流量 思路一致,使用等差的思想,用连续座位号 - 排行,若是连续的,差值一定相同,再统计相同差值的个数即可。
①先筛选出free非0的数据,再给筛选后的数据以id进行连续排序,然后计算id与排序号的差值;
1 select seat_id,free,seat_id - dense_rank() over(order by seat_id) as rnk 2 from cinema_603 3 where free = 1;
②再以第一步查询到的rnk分组,统计差值相同的个数;
1 select seat_id,count(seat_id) over (partition by rnk) as cout 2 from ( 3 select seat_id,free,seat_id - dense_rank() over(order by seat_id) as rnk 4 from cinema_603 5 where free = 1 6 ) as temp1
③根据上一步的查询结果,筛选出cout >= 2的数据,再按seat_id升序排列输出即可。
1 select seat_id 2 from ( 3 select seat_id,count(seat_id) over (partition by rnk) as cout 4 from ( 5 select seat_id,free,seat_id - dense_rank() over(order by seat_id) as rnk 6 from cinema_603 7 where free = 1 8 ) as temp1 9 ) as temp2 10 where cout >= 2 11 order by seat_id;
注意:
我做这道题的时候突然在想一个问题:使用row_number() over()来排序是不是更好一点,但是这两题都是以id来排序的,id不会重复,故用rank() over()、 dense_rank() over()、row_number() over()任何一种都可以。
小知识:
rank() over():是按over()里面的字段进行跳跃排序,比如:1,2,2,4,...
dense_rank() over():是按over()里面的字段进行连续排序,比如:1,2,2,3,...
row_number() over():是按over()里面的字段进行连续排序,比如:1,2,3,4,...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)