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