2016-07-14 6 views
3

Ich habe eine Tabelle Theater(Sn, SeatVacant)Wählen Zeilen derselben Spalte Wert mit mehr als 3-mal

e.g SN SEATVACANT 
    1 Y 
    2 Y 
    3 N 
    . . 
    . . 
    100 Y 

Ich will buchen 3 Sitze (sollte kontinuierlich sein) genannt. Wie kann ich den kontinuierlich freien Platz bekommen?

+5

* Lücken-und-Inseln * - Z. B. [Finde "n" aufeinanderfolgende freie Nummern aus der Tabelle] (http://dba.stackexchange.com/questions/36943/find-n-consecutive-free-numbers-from-table) –

+1

Wenn das wirklich ein Theater darstellt, dann ich bezweifle, dass es eine einzige Reihe von 100 Sitzen gibt. Wahrscheinlich müssen Sie also auch berücksichtigen, welche Plätze numerisch aneinandergrenzen, aber nicht physisch nebeneinander. – sstan

Antwort

1
select f1.sn, f2.sn, f3.sn from Theater f1 
inner join Theater f2 on f1.sn=f2.sn + 1 
inner join Theater f3 on f1.sn=f3.sn + 2 
where f1.SEATVACANT='Y' and f2.SEATVACANT='Y' and f3.SEATVACANT='Y' 
+0

Danke. Es funktioniert .... Aber es ist eine statische Lösung, kann ich es dynamisch machen. zum Beispiel x Nummer der kontinuierlichen freien Platz –

1
with tablenewkey as(
select ROW_NUMBER() over(order by f1.sn) newkey, f1.* from theater f1 
), 
nbplacevacant as (
select 3 as NbrowByGroup 
), 
calculdiff as (
select f1.*, isnull(f3.newkey, 0) newkeylastN, f1.newkey - isnull(f3.newkey, 0) DiffYWithLasN 
from tablenewkey f1 
outer apply 
(
select top 1 * from tablenewkey f2 
where f2.newkey<f1.newkey and f2.SEATVACANT='N' 
order by f2.newkey desc 
) f3 
where f1.SEATVACANT='Y' and (f1.newkey - isnull(f3.newkey, 0))>=(select NbrowByGroup from nbplacevacant) 
), 
possibilite as (
select f0.*, f1.newkey Groupement, f1.DiffYWithLasN 
from tablenewkey f0 inner join calculdiff f1 
on f0.newkey between (f1.newkey - DiffYWithLasN +1) and f1.newkey 
where f0.SEATVACANT='Y' 
) 
select newkey, sn, Groupement, DENSE_RANK() over(order by Groupement) PossiblilityRang from possibilite 
order by groupement, sn 
1

Like this, wenn Sie eine dynamische Lösung wollen:

--Theater(Sn, SeatVacant) 

DECLARE @ContiguougsSeats AS INT 
SET @ContiguougsSeats = 4 

SELECT Sn, ' to ', [email protected] 
FROM Theater As t1 
WHERE [email protected]ugsSeats-1 <= (Select MAX(Sn) From Theater) 
    AND NOT EXISTS(
    Select * 
    From Theater As t2 
    Where t2.Sn Between t1.Sn AND [email protected] 
     And t2.SeatVacant = 'N' 
    ) 
+1

Nizza, juste ein kleiner Fehler, wenn Sie Ihren Code, t2.SEATVACANT = 'N' – Esperento57

+1

@ Esperento57 Danke, jetzt behoben. – RBarryYoung

Verwandte Themen