2014-11-05 53 views
0

我編寫了一個應用程序,其中記錄了許多車輛的使用情況,如屏幕截圖所示。SQL報告顯示記錄條目之間的差距

我想爲單個用途之間的差距(以英里爲單位)生成報告,因爲車輛不應該用於應用程序中記錄的行程以外的其他車輛。

當前記錄求得里程錶時 - 前一記錄結束里程錶產生大於0的數字 - 對於該特定車輛,會出現間隙。看到不同的彩色圓圈。我怎樣才能實現這一點與SQL?我使用的是oracle(11g),但我想象的是sql會相似。謝謝。

輸出示例:

Vehicle V06 
    Invoice Date Dest Gap 
    123  1/2/14 York 14.0 
    122  1/1/14 Pburg 0.0 
    Vehicle V05 
    Invoice Date Dest Gap 
    121  1/3/14 Mill 0.0 

vehicle usage database
*我意識到我應該用包括GAP測試數據,儘管這些應該是在實踐中很少見。在這種情況下,

Invoice 67189 would have End Od of 92590 resulting in a GAP of 3.0 miles for 67190 
+1

您的示例數據沒有差距。也許你可以放入更具代表性的數據集以及你想要回來的結果。另外,用您正在使用的數據庫標記問題。 – 2014-11-05 15:02:23

+0

另外它是一個表格或多個表格(標準化數據)。 – 2014-11-05 15:04:58

+0

@GordonLinoff完成(標籤)。有些差距應該是罕見的,因爲這意味着有人非法使用這輛車。我在帖子中添加了一個示例輸出。 – John 2014-11-05 15:07:18

回答

2

只需使用lag()

select vu.* 
from (select vu.*, 
      lag(endod) over (partition by vehicle order by date) as prev_endod 
     from vehicleusage vu 
    ) vu 
where begod <> prev_endod; 

注意,比較會爲NULL值失敗,所以有與車輛的第一記錄沒有問題。

+0

作爲一個決勝盤,我會建議:'分隔車輛ORDER BY日期,beg_od)' – wildplasser 2014-11-05 18:01:22

+0

感謝您向我介紹滯後函數!現在剩下的就是一個將會執行begod - prev_endod的列來顯示差距里程。 – John 2014-11-05 18:33:50

0
SELECT 
    D1.invoiceNo, 
    D1.vehicalId, 
    CASE WHEN D1.odBeg > D0.odEnd THEN 'MISSING MILES' ELSE 'EXTRA MILES' END AS Notes 
FROM 
    (SELECT vehicalId,invoiceNo, RANK() OVER(PARTITION BY vehicalId ORDER BY dateUsed) AS KEY_CUR, odBeg,odEnd FROM @DATA) AS D0 
    INNER JOIN 
    (SELECT vehicalId,invoiceNo, RANK() OVER(PARTITION BY vehicalId ORDER BY dateUsed) - 1 AS KEY_LAST, odBeg,odEnd FROM @DATA) AS D1 
    ON D0.vehicalId = D1.vehicalId AND D0.KEY_CUR = D1.KEY_LAST 
WHERE 
    D1.odBeg <> D0.odEnd