2017-07-04 2 views
0

i mit Auto in Zügen Reservierung arbeite vorschlagen Stühle abfragenSQL Query Stühle vorschlagen

es soll Reisedatum nehmen, von Station zu Station und keine Sitz als Bindevariablen und retrive Stühle, die in Sequenz und nicht reserviert. zum Beispiel: wenn Stuhl 1,3 ist reserviert und Stühle 2,4,5 nicht reserviert und Benutzer eingegeben 2 Sitze, dann Abfrage sollte vorschlagen 4,5 und nicht 2,4

Ich versuche zu verwenden lead oder lag analyic Funktionen

select * from 
(
    select row_number() over (order by seat_no) rno, seat_no,lag(seat_no,1,0) OVER (ORDER BY seat_no) lag , lead(seat_no,1,0) OVER (ORDER BY seat_no) lead 
    from TRAIN_LINE_DETAILS tld,train_lines tl 
    where TRIP_DATE = to_date(:tipDate,'dd-mm-yyyy')    
    and tld.line_code = tl.line_code 
    and station_from =:sfrom 
    and station_to =:sto 
    and is_reserved = 0 
) 

where rno <= :n 
--and lead-1 = seat_no or lag+1 = seat_no 

Ausgang: output screenshot

+1

Effektiv benötigen Sie Inseln von Sitzen, http://www.orafaq.com/node/2865 – Serg

+1

Ihre Anforderung scheint nicht klar genug. Wenn wir nicht reserviert haben: '2, 4, 5, 11, 12, 13, 14, 31, 32, 33, 34, 35' und Benutzer geben ** 5 ** ein, was würden wir vorschlagen? Und was wäre wenn ... 14, 16, 31 ... statt "... 14, 31, ...". Und Ihr Problem kann einen Algorithmus zur Lösung und nicht nur eine komplexe Abfrage benötigen. –

Antwort

0

Ohne Beispieldaten oder Beschreibungen Ihrer Tabellen ist es schwierig zu testen, aber so etwas wie dies:

SELECT seat_no 
FROM (
    SELECT seat_no, 
     is_reserved, 
     COALESCE( 
      LEAD(CASE is_reserved WHEN 0 THEN seat_no END) 
      IGNORE NULLS OVER (ORDER BY seat_no), 
      seat_no + 1 
     ) AS next_reserved_seat 
    FROM TRAIN_LINE_DETAILS tld 
     INNER JOIN train_lines tl 
     ON (tld.line_code = tl.line_code) 
    WHERE TRIP_DATE = to_date(:tipDate,'dd-mm-yyyy')    
    AND station_from =:sfrom 
    AND station_to =:sto 
) 
WHERE is_reserved = 0 
AND next_reserved_seat - seat_no >= :n; 

Dies setzt voraus, dass alle Sitze in Ihrer Tabelle aufgelistet sind und jeder hat eine zugehörige is_reserved Flagge, die 0 ist, wenn der Sitz nicht reserviert ist. Die Abfrage wird durch alle Plätze gehen, die nach denen suchen, wo der Sitz und die nachfolgenden Plätze nicht reserviert sind und die Sitznummer am Anfang des nicht reservierten Bereichs ausgeben.