--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就好