2014-01-15 114 views
1

我有一個表的傳遞地點處理記錄

ID: int 
CarPlate: int 
PassDate: date 
PassType: byte > 1 enter, 2 exit 

記錄或卡片列表我要選擇的時間每輛車按日期 一直在那個地方,現在的總量,這是我的策略,但我不能實施它。

成像在卡進入,在特定日期退出是如下:

 
    1- enter > 
    2- enter > 
    3- < exit 
    4- enter > 
    5- < exit 

這種特殊的汽車已連續3次輸入和退出兩次,我只希望進入和退出是背靠背這樣我需要爲特定日期的所有卡片選擇所有輸入,然後在下一次輸入之前檢查是否有退出,然後繼續此操作直到每個板塊和下一個板塊結束。

我有實現的通過平板 並在最後爲我的最終結果會這個過程應該是這樣的

CarPlate | Date | EnterExit | Duration 

這EnterExit問題是進入的集合的串並退出

 
    enter at ..... exit at ..... 
    enter at ..... exit at ..... 
    enter at ..... exit at ..... 
    enter at ..... exit at ..... 
+2

發佈一些示例數據。 – San

回答

0

事情是這樣的:

select carplate, 
     enter_time, 
     exit_time, 
     exit_time - enter_time as duration 
from (
    select carplate, 
     passtype, 
     passdate, 
     case 
      when passtype = 'exit' then lag(passdate) over (partition by carplate order by passdate) 
      else null 
     end as enter_time, 
     case 
      when passtype = 'exit' then passdate 
      else null 
     end as exit_time, 
     case 
      when lag(passtype) over (partition by carplate order by passdate) <> passtype then 1 
      else 0 
     end as valid 
    from cars 
    order by carplate, passdate 
) t 
where valid = 1 
    and passtype = 'exit'; 

(我換成你的價值12'enter''exit'使查詢更具可讀性)

這個計算進入/退出時間連續的行,然後只選擇那些在exitenter後立即發生。

這是一個SQLFiddle:http://sqlfiddle.com/#!4/df6c0/1