2017-07-04 62 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。查询将遍历所有座位,寻找座位和后续座位未预留的座位,并在非预留范围开始时输出座位号。