连续性问题

力扣603. 连续空余座位

如题:
在这里插入图片描述

方法一:使用多表连接,选出连续值进行去重
select distinct 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

例子:
当c1=c2=1,2,3,4,5时,
当c1=1时,abs(c1.seat_id - c2.seat_id) = 1,c2只能取[2],c2.free=1不成立
当c1=2时,abs(c1.seat_id - c2.seat_id) = 1,c2可以取[1,3],c1.free=1不成立
当c1=3时,abs(c1.seat_id - c2.seat_id) = 1,c2可以取[2,4],当c2=2时,c2.free=1不成立,但是c2=4时,c2.free=1成立,所以取一次[3]
当c1=4时,abs(c1.seat_id - c2.seat_id) = 1,c2可以取[3,5],c2都满足
所以要取两次[4,4],所以最后要进行去重

方法二:使用窗口函数,进行排名筛选
select seat_id from
(select seat_id,count(seat_id) over(partition by cnt) cnt from
(select seat_id,(seat_id - aaa) as cnt from
(select *,row_number() over() as aaa from cinema
where free = 1)t1
)t2
) t3
where cnt >1

第一步,筛选出free=1的,进行排名
在这里插入图片描述
第二步,进行seat_id-aaa,挨着的,数字都会相等
在这里插入图片描述
第三步:最后分组筛选计算count(cnt)>1
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值