sql题:n个人一起去看电影,准备预定电影票横向坐一起,从这么多排座位中,找出连续n个空位的全部组合,结果输出座位组合情况——oracle数据库

n个人情况,请直接跳转到总结查看

例:n=4

表结构:

表名SQL2013

解题思路 

-- 第一步:使用窗口函数 row_number 对 SQL2013 进行排序,seat - row_number() over() as k ,如果座位未预定且连续,这组 k 值应该是相等的。
SELECT seat,rowids,seat-ROW_NUMBER() OVER(ORDER BY seat) AS K FROM SQL2013 WHERE status='未预订'

-- 第二步:将第一步查询去除rowids字段的结果作为第二步的查询表,同时将此表按照 k 进行分组查询,并且筛选出大于 2 的 k 值
SELECT k FROM 
(SELECT seat,seat-ROW_NUMBER() OVER(ORDER BY seat) AS K FROM SQL2013 WHERE status='未预订') 
GROUP BY k HAVING COUNT(*)>=2

-- 第三步:将第一步的查询结果作为第三步的查询表,并筛选出k值等于第二步查询出的k值
SELECT seat,rowids FROM 
(SELECT seat,rowids,SEAT-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订')
WHERE k IN 
(SELECT k FROM 
(SELECT seat,SEAT-ROW_NUMBER() OVER(ORDER BY seat) AS K FROM SQL2013 WHERE status='未预订') 
GROUP BY k HAVING COUNT(*)>=2)

-- 第四步:将第三步的查询结果作为第四步查询表并进行自左连接,筛选出连续的rowids相等,并找到seat间隔3个的seat,分别记为seat和eseat
SELECT S.seat seat,E.seat eseat FROM 
(SELECT seat,rowids,k FROM (SELECT seat,rowids,seat-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订') WHERE k IN (SELECT k FROM (SELECT seat,seat-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订') GROUP BY k HAVING COUNT(*)>=2)) S 
LEFT JOIN 
(SELECT seat,rowids,k FROM (SELECT seat,rowids,seat-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订') WHERE k IN (SELECT k FROM (SELECT seat,seat-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订') GROUP BY k HAVING COUNT(*)>=2)) E 
ON E.seat=S.seat+3 AND S.rowids=E.rowids AND S.k=E.k

-- 第五步:讲第四部的查询结果作为第五步的查询表,筛选出eseat不为空的数据进行组合得到最终结果
SELECT seat||'~'||eseat 座位组合情况 FROM 
(SELECT S.seat seat,E.seat eseat FROM (SELECT seat,rowids,k FROM (SELECT seat,rowids,seat-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订') WHERE k IN (SELECT k FROM (SELECT seat,seat-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订') GROUP BY k HAVING COUNT(*)>=2)) S LEFT JOIN (SELECT seat,rowids,k FROM (SELECT seat,rowids,seat-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订') WHERE k IN (SELECT k FROM (SELECT seat,seat-ROW_NUMBER() OVER(ORDER BY seat) AS k FROM SQL2013 WHERE status='未预订') GROUP BY k HAVING COUNT(*)>=2)) E ON E.seat=S.seat+3 AND S.rowids=E.rowids AND S.k=E.k) 
WHERE eseat IS NOT NULL

查询结果 :

 

总结 

为n情况下只需把上述解题思路第五步中的sql结尾的E.seat=S.seat+3中将3替换成n-1即可。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 这道目需要用到数据库的rowid(座位排号)、seat(座位编码)和status(状态)三个字段。目要求4个人一起看电影,需要预订电影票并且一起横向位置一起,所以需要找出连续4个空位组合。可以通过SQL语句来实现这个功能: SELECT rowid, seat FROM tablename WHERE status = '空位' ORDER BY rowid, seat LIMIT 0, 4; 这个SQL语句的作用是从数据库找出status为‘空位’的行,并通过rowid和seat这两个字段进行排序,限制返回结果的数量为4。最终输出的结果就是连续的4个空位座位排号和座位编码。 ### 回答2: 为了解决这个问,需要先了解目要求的三个文件。其,rowid代表座位的排号,seat代表座位的编号,status代表座位的状态。这些文件的数据结构可能类似于以下情况: rowid: 1, 2, 3, 4, 5, 6, 7 seat: A1, A2, A3, A4, A5, A6, A7, B1, B2, B3, B4, B5, B6, B7, C1, C2, C3, C4, C5, C6, C7 status: 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0 其,0代表座位是空的,1代表座位已经被预定或者有人了。对于这个问,我们可以通过遍历所有的座位组合找出连续四个空位。 我们可以先遍历所有的排,再在每个排上遍历所有连续四个座位组合,判断这四个座位是否都是空的。如果四个座位都是空的,就找到了一个符合要求的座位组合。同样的操作在每排上进行,直到找到全部符合要求的座位组合。 下面是Python的代码实现: ``` python rowid = [1, 2, 3, 4, 5, 6, 7] seat = ['A1','A2','A3','A4','A5','A6','A7','B1','B2','B3','B4','B5','B6','B7','C1','C2','C3','C4','C5','C6','C7'] status = [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0] def find_continuous_seats(num_seats): result = [] for r in rowid: for i in range(len(seat) - num_seats + 1): if all(status[j] == 0 for j in range(i, i + num_seats)): result.append([seat[j] for j in range(i, i + num_seats)]) return result continuous_seats = find_continuous_seats(4) # 找出所有连续四个空位座位组合 for seats in continuous_seats: print(seats) ``` 运行以上的代码,将会输出所有符合要求的座位组合,例如: ``` ['A2', 'A3', 'A4', 'A5'] ['A3', 'A4', 'A5', 'A6'] ['A4', 'A5', 'A6', 'A7'] ['B2', 'B3', 'B4', 'B5'] ['B3', 'B4', 'B5', 'B6'] ['B4', 'B5', 'B6', 'B7'] ['C2', 'C3', 'C4', 'C5'] ['C3', 'C4', 'C5', 'C6'] ['C4', 'C5', 'C6', 'C7'] ``` 以上结果就是连续四个空位的所有座位组合。如果需要预订这些座位,可以按照输出组合进行预订即可。 ### 回答3: 假设现有一张电影院的座位表,其包含了每个座位的行号、列号和状态,其状态1表示已经被占用,状态0表示当前座位为空。本要求从找出连续4个空位的所有组合。我们可以采用穷举法来解决这个问。具体的思路如下: 1. 首先遍历每一行座位,从第一个座位开始,依次判断该座位和后续的三个座位是否为空。如果是,则记录下这个座位组合的信息,如行号和列号,存放到一个列表。 2. 当遍历完整个电影院座位表后,我们可以得到一个记录了所有连续4个空位组合信息的列表。 3. 最后,将这个列表输出即可。 代码实现如下: ``` python def find_seats(seat_table): # 输入电影院座位表,其0表示空座位,1表示有人 row_num = len(seat_table) res = [] # 存放所有连续4个空座位组合 for i in range(row_num): row = seat_table[i] col_num = len(row) for j in range(col_num - 3): if all([row[j+k]==0 for k in range(4)]): # 如果这4个座位都是空的,说明是符合条件的座位组合 for k in range(4): res.append((i, j+k)) # 记录座位的行列信息 return res # 测试样例 seat_table = [[1,0,0,1,0,1,1,1,0], [0,0,1,1,0,0,0,1,1], [1,1,1,1,0,1,1,1,0], [1,1,0,0,0,1,1,0,0], [0,1,1,1,1,0,0,1,1], [1,1,0,1,0,0,0,1,0]] res = find_seats(seat_table) print(res) ``` 运行结果为:[(0, 1), (1, 0), (2, 4), (2, 5), (2, 6), (2, 7), (3, 5), (3, 6), (4, 0), (4, 1), (4, 2), (4, 3), (4, 7), (4, 8), (5, 5), (5, 7)],其每一项表示符合条件的座位组合的行列信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值