通过 Seatrow 选择连续座位

Mac*_*ack 4 sql-server subquery

SELECT TOP N seats.*, eventtickets.eticketprice from seats 
INNER JOIN eventtickets ON eventtickets.etickettype = seats.seattype 
WHERE ((Seats.seatType ='BOXSEAT') 
AND seatID not in (select seatID from ticketsales WHERE eventID=6))
ORDER BY convert (int, seats.seatSection), seats.seatrow ASC
Run Code Online (Sandbox Code Playgroud)

我上面的查询生成了 N 个座位中的最佳可用数量,但它会填满一个部分,然后将该订单的其余部分放在下一个部分。我需要它来找到一个新的部分,所有 N 个座位都可用。如果座位在TicketSales桌子上,则不可用。如果salecategory为 Null,则表示票证尚未售出/阻止/保留,因此可用。

它显然限制在 6 个座位上,但我确实有一个部分,一排有 30 多个座位。

Section 1: 
Row 1: 1-2-3
Row 2: 4-5-6

Section 2:
Row 1: 1-2-3
Row 2: 4-5-6
Run Code Online (Sandbox Code Playgroud)

等等。

我没办法。连续盯着这个看了两天,我的脑子里一片空白。我在 SQL 方面非常薄弱,令人惊讶的是我远远超过了这一点。我想我已经接近了,但没有辣酱玉米饼馅。

请参阅随附的 2 个主表的图片。我只需要seatpricefromeventtickets表所以它不是那么重要。

我感谢你在这方面给我的任何帮助。

售票处

座位

Rob*_*ley 5

如果您对已有的内容感到满意,请尝试从一组不同的部分开始,交叉连接,然后将您的子查询过滤到仅该部分。这样,就像将每个部分视为自己的事件一样。

但是......为什么不考虑查看所有座位并找到第(N-1)个下一个是实际正确数字的块:

SELECT * FROM
(SELECT seats.*, eventtickets.eticketprice,
    LEAD(seats.SeatID,@N-1) OVER (PARTITION BY seats.seatSection ORDER BY seats.SeatID) AS SeatNAway
from seats 
INNER JOIN eventtickets ON eventtickets.etickettype = seats.seattype 
WHERE ((Seats.seatType ='BOXSEAT') 
AND seatID not in (select seatID from ticketsales WHERE eventID=6))
) s
WHERE s.SeatId = s.SeatNAway - (@N-1)
ORDER BY convert (int, s.seatSection), s.seatrow ASC
Run Code Online (Sandbox Code Playgroud)

看看你如何处理这个也许......当然,检查你是否理解内部子查询。