我正在研究预订座位的系统。用户输入希望保留的座位数,数据库将返回一组建议的座位,这些座位与先前未保留的座位数相匹配。
例如,如果我有桌子:

SeatID | Reserved
-----------------
1      | false
2      | true
3      | false
4      | false
5      | false
6      | true
7      | true
8      | false
9      | false
10     | true

并且用户输入他们希望保留2个座位,我希望查询返回座位(3,4),(4,5)和(8,9)没有保留,并且与给定的输入座位数匹配。座位分为几部分和几排。连续座位必须在同一排。
我应该如何构造这个查询,使其能够找到与给定输入匹配的所有可用连续座位?

最佳答案

使用SQL Server 2005/2008:

WITH FreeSeatGroups AS
(
    SELECT S1.SeatID AS StartID,
           (SELECT MIN(S2.SeatID)
            FROM Seats S2
            WHERE S2.SeatID > S1.SeatID
            AND S2.Reserved = 1) - S1.SeatID AS FreeSeatCount
    FROM Seats AS S1
    WHERE S1.Reserved = 0
)
SELECT StartID, FreeSeatCount
FROM FreeSeatGroups
WHERE FreeSeatCount >= 2

注意,这将返回ids 3、4和8,因为每个位置都有两个免费座位。
这也假设座位id始终是连续的。如果没有,您可以进入ROW_NUMBER()

08-26 08:26