2017-07-04 57 views
0

我在火車預訂的工作與自動提示椅子查詢SQL查詢建議椅

它應該採取的行程日期,從站,車站也沒有座位的綁定變量和retrive在序列椅子和不保留。例如:如果椅子1,3被保留,而椅子2,4,5不保留並且用戶輸入2個椅子,則查詢應該建議4,5而不是2,4

我正在嘗試使用leadlag analyic功能

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 

輸出: output screenshot

+1

實際上,您需要座位的島嶼,請參閱http://www.orafaq.com/node/2865 – Serg

+1

您的要求似乎不夠清楚。如果我們沒有保留:'2,4,5,11,12,13,14,31,32,33,34,35'和用戶輸入** 5 **,那麼我們會建議什麼?如果「...... 14,16,31 ......」而不是「...... 14,31 ......」則會發生什麼?而你的問題可能需要一個算法來解決,而不是簡單地通過一個複雜的查詢。 –

回答

0

沒有任何樣本數據或你的表的描述是很難測試,但這樣的事情:

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; 

這假設所有座位都列在您的表格中,並且每個座位都有相關的is_reserved標誌,當座位未被預留時,該標誌爲0。查詢將遍歷所有座位,尋找座位和後續座位未預留的座位,並在非預留範圍開始時輸出座位號。