sql电影院n人连续座位问题

问题遇到的现象和发生背景

img


4个人一起去看电影,准备预订电影票横向坐一起,从这么多排座位中,找出连续4个空位的全部组合,结果输出座位组合情况,例(14)(69)思考—下如果是N个人的话应该如何解决,是否有一套通用的查询语句来完成题目

问题相关代码,请勿粘贴截图

--use sqlsever
select CONCAT('(',a.seat,'~',b.seat,')') 座位
from eight_five_three a left join
(select seat,status,rowid from eight_five_three group by seat,status,rowid) b on (a.seat=b.seat-1 and b.status = '未预订'and a.rowid = b.rowid) left join
(select *,count(seat) x from eight_five_three group by seat,status,rowid) c on ((c.seat between b.seat and a.seat) and c.status = '未预订' and c.rowid = a.rowid)
where a.status = '未预订' and c.x=2
group by a.seat,b.seat

运行结果及报错内容

尝试写出了如上代码,不知道为什么查不出数据

我的解答思路和尝试过的方法

查出首座位和尾座位,查中间满足条件的座位数量是否满足要求,满足则输出首尾座位

我想要达到的结果

结果输出座位组合情况

我倒是有个筛选N个连续座段的思路但是没想出怎么计算所有组合。
计算连续段的话两个row_number一个all窗口一个status窗口相减号一样则为连续的段,使用这个号计算一个count即可筛选出N个连续座位,也可以使用collect_set这种收集这些座位号但是计算组合不会搞

存入数据的时候可以把连续的座位按照顺序输入。查询的时候按照连续值大于等于4就可以了。
可以考虑使用下面的方案:
先找出符合条件的排
where status='未预定' group by rowid having count(*) >= 4

再在排里面去找(这个可以试着用java等后端代码找会更快点)
如果用sql去处理的话,在判定连续这个有点麻烦(可能你需要单独写个函数之类的来处理下)

将表进行自关联,连接条件rowid相等(同一排),a.row_id between b.row_id and b.row_id+3,再进行筛选a.status='未预定' and b.status='未预定',最后再根据a.row_id进行分组having count(*)=4,即为满足连续4个空位的首座。如果是N人的话只需要把对应数字改为对应的n-1和n就好