2014-11-05 33 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