前言
练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。
今日题目:
603.连续空余座位
表:Cinema
列名 | 类型 |
---|---|
seat_id | int |
free | bool |
Seat_id 是该表的自动递增主键列。
在 PostgreSQL 中,free 存储为整数。请使用 ::boolean 将其转换为布尔格式。
该表的每一行表示第 i 个座位是否空闲。1 表示空闲,0 表示被占用。
查找电影院所有连续可用的座位。
返回按 seat_id 升序排序 的结果表。
我那不值一提的想法:
- 首先梳理表内容,题干一共给了一张电影表,记录了座位id,以及座位是否空缺
- 其次分析需求,需要得到两个以上的座位连续可用
- 这道题最简单的方法当然是自连接,但是不够灵活,这里我们使用row_number(),row_number()解决连续问题以前已经写过了,这里就不细写了
https://blog.csdn.net/dkmaa/article/details/136302362?spm=1001.2014.3001.5506
- 下面就是完整代码
with rk as(
select seat_id,free,seat_id - row_number() over(partition by free order by seat_id) as rk_rank
from Cinema
where free = 1
)
select seat_id
from rk
where rk_rank in (
select rk_rank
from rk
group by free,rk_rank
having count(*) >=2
)
结果:
总结:
能运行就行。