【LeetCode-SQL】603. 连续空余座位
目录
- 一、题目
- 二、解决
- 1、join
- 2、row_number() over()
- 3、变量
- 三、参考
一、题目
表: Cinema
+-------------+------+
| Column Name | Type |
+-------------+------+
| seat_id | int |
| free | bool |
+-------------+------+
Seat_id是该表的自动递增主键列。
该表的每一行表示第i个座位是否空闲。1表示空闲,0表示被占用。
编写一个SQL查询来报告电影院所有连续可用的座位。
返回按 seat_id 升序排序 的结果表。
测试用例的生成使得两个以上的座位连续可用。
查询结果格式如下所示。
示例 1:
输入:
Cinema 表:
+---------+------+
| seat_id | free |
+---------+------+
| 1 | 1 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
+---------+------+
输出:
+---------+
| seat_id |
+---------+
| 3 |
| 4 |
| 5 |
+---------+
二、解决
1、join
思路:
只有一张表,需要通过seat_id自己连自己,条件是abs(c1.seat_id - c2.seat_id) = 1。
代码:
selectdistinct c1.seat_id
from cinema c1 join cinema c2
on abs(c1.seat_id - c2.seat_id) = 1 and c1.free = 1 and c2.free = 1
order by c1.seat_id;
2、row_number() over()
思路:
S1:使用窗口函数 row_number 对 cinema 进行排序,seat_id - row_number() over() as k ,如果座位连续,这组 k 值应该是相等的。
S2:将第一步和第二步的结果作为临时表 temp,将临时表 temp 按照 k 进行分组查询,并且筛选出大于 2 的 k 值
S3:从临时表 temp 中查询出 seat_id ,筛选出 k 值在第四步中的值
代码:
with temp as (selectseat_id,seat_id - row_number() over() as kfrom cinema where free = 1
)
select seat_id from temp where k in (select k from temp group by k having count(*) >= 2
);
3、变量
思路:
方法二中使用窗口函数的地方替换成了 case … when … then … end 的形式
在运行第一条数据时不会,不会进入第一个 when 子句中,它会进入第二个 when 子句。第二个 when 子句的作用是对 @pre_free 和 @pre_seat_id 进行初始化
当运行第二条数据时,就会进入第一个 when 子句,不会进入第二个 when 子句了。第一个 when 子句中会判断 @pre_free (上一数据 free)和 free (当前的 free) 是否相等,并且 free 是等于 1 的,输出 @pre_seat_id (上一条数据的 seat_id)
代码:
with temp as (selectseat_id,casewhen @pre_free = free and free = 1 then @pre_seat_idwhen @pre_free:=free then @pre_seat_id:=seat_idend as kfrom cinema, (select @pre_free:=null, @pre_seat_id:=null) init
)
select seat_id from temp where k in (select k from temp group by k having count(*) >= 2
);
三、参考
1、三种方法——解连续空余的座位(笛卡尔积/窗口函数/case when …)
【LeetCode-SQL】603. 连续空余座位相关推荐
- leetcode简单之603.连续空余座位
表: Cinema Column Name Type seat_id int free bool Seat_id是该表的自动递增主键列. 该表的每一行表示第i个座位是否空闲.1表示空闲,0表示被占用. ...
- LeetCode 603.连续空余座位
数据准备 drop table Cinema;Create table If Not Exists Cinema (seat_id int primary key auto_increment, fr ...
- 【LC简单】603. 连续空余座位
❤️博客主页: 楚生辉 ❤️系列专栏:[LeetCode刷题] ❤️一句短话: 坚持不懈,孜孜不倦 1.题目描述 表: Cinema +-------------+------+ | Column N ...
- 603. 连续空余座位
这题就是找到至少连续两个空位(布尔值为true) 这种题目一看到要养成条件反射,一个是id差为1,一个就是复表的使用,最后要去重. 给出代码: SELECT DISTINCT a.seat_id FR ...
- LeetCode刷题实战603:连续空余座位
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- leetcode603. 连续空余座位(SQL)
几个朋友来到电影院的售票处,准备预约连续空余座位. 你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗? | seat_id | free ...
- leetcode-SQL-603. 连续空余座位
leetcode-SQL-603. 连续空余座位 题目 解题 方法一:笛卡尔积 题目 题目链接 表: Cinema +-------------+------+ | Column Name | Typ ...
- Leetcode_603. 连续空余座位
题目难度 简单 题目描述 几个朋友来到电影院的售票处,准备预约连续空余座位. 你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗? seat ...
- 【持续更新】Leetcode SQL题目全解析(附建表sql)
Leetcode SQL题目全解析 越前须知(雾) 题目Q & A 175 组合两个表 181 超过经理收入的员工 182 查找重复电子邮箱 183 从不订购的用户 197 上升的温度 511 ...
最新文章
- 并查集(压缩路径+按秩排序)
- java 线程相关的属性介绍
- .WM_CTLCOLOR和OnCtlColor消息的用法
- 信号处理之DFT、IDFT
- 性能媲美BERT却只有其1/10参数量? | 近期最火模型ELECTRA解析
- TMS320 C6000系列 DSP之 CCS5.5 仿真调试
- oracle禁止自动启动命令,自动启动和关闭Oracle 脚本
- 汇编语言 修改内存中的过时数据
- 分布式文件系统(HDFS)与 linux系统文件系统 对比
- .NET生成静态页面并分页
- 3.5英寸万转硬盘的末路(万转“偏瘫”记连载二)
- 多目标跟踪之数据关联算法——匈牙利算法
- 桌面版whatsapp自动发送实例分析
- 云顶之弈服务器维护多长时间,英雄联盟3.17更新维护时间介绍 云顶之弈什么时候可以玩_18183云顶之弈专区...
- 关于机器人方面的sci论文_机器人领域国际期刊(SCI收录)
- 用c语言实现窗口化,c怎么窗口化只能开挂吗
- 【Kotlin 初学者】字符串常用操作汇总
- linux系统nginx安装教程,Linux下Nginx安装教程
- 抖音短视频矩阵系统/源码/系统搭建
- 在领悟到什么道理后,你的人生从此轻松了起来?