用于显示记录项之间差距的SQL报表

用于显示记录项之间差距的SQL报表,sql,oracle,gaps-in-data,Sql,Oracle,Gaps In Data,我编写了一个应用程序,其中记录了大量车辆的使用情况,如屏幕截图所示 我想生成一个报告,说明不同使用之间的里程差距,因为除了应用程序中记录的旅行之外,不应使用车辆 当当前记录的beg里程表(前一记录的末端里程表产生的数字大于0)用于该特定车辆时,会出现间隙。看不同颜色的圆圈。如何使用sql实现这一点?我使用的是Oracle11g,但我认为sql也会类似。多谢各位 样本输出: Vehicle V06 Invoice Date Dest Gap 123 1/2/14 Yo

我编写了一个应用程序,其中记录了大量车辆的使用情况,如屏幕截图所示

我想生成一个报告,说明不同使用之间的里程差距,因为除了应用程序中记录的旅行之外,不应使用车辆

当当前记录的beg里程表(前一记录的末端里程表产生的数字大于0)用于该特定车辆时,会出现间隙。看不同颜色的圆圈。如何使用sql实现这一点?我使用的是Oracle11g,但我认为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
*我意识到我应该使用包含间隙的测试数据,尽管这些在实践中应该很少。在这种情况下,

  Invoice 67189 would have End Od of 92590 resulting in a GAP of 3.0 miles for 67190
只需使用滞后:


请注意,空值的比较将失败,因此车辆的第一次记录没有问题。

您的示例数据没有间隙。也许你可以把一个更具代表性的数据集与你想要得到的结果放在一起。另外,用您正在使用的数据库标记问题。另外,是一个表还是多个表的规范化数据。@GordonLinoff Done标记。是的,这应该是罕见的,因为这意味着有人非法使用了这辆车。我在帖子中添加了一个示例输出。@StephenBodine我确实有另一个表,其中包含每个车钥匙的车辆描述,但这对本报告来说根本不重要,对于gap报告,它只是屏幕截图中所示的一个表。lagend_od,1按车辆id划分,按beg_od排序看起来像您需要的。并将结果与beg_id进行比较,显然,作为一个平局破坏者,我建议:按日期按车辆顺序划分,beg_id感谢您向我介绍滞后函数!现在只剩下一列,它将执行begod-prev_endod以显示差距英里数。
 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
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;