SQL Query用于获取两行值之间的差异

时间:2016-08-05 05:01:54

标签: sql oracle

我正在寻找一个SQL-Query来计算两个值之间的差异,如下例所示:

Date        |  OrderNr |   TotalDelivered | ->   DeliveredToday
01.08.2016  |  123     |   1000           | ->   1000
01.08.2016  |  456     |   250            | ->   250
01.08.2016  |  789     |   3400           | ->   3400
02.08.2016  |  123     |   1300           | ->   300
02.08.2016  |  456     |   400            | ->   150
02.08.2016  |  789     |   4000           | ->   600
05.08.2016  |  123     |   1300           | ->   0
05.08.2016  |  456     |   500            | ->   100
05.08.2016  |  789     |   4050           | ->   50

因此查询应自动计算" DeliveredToday"每个OrderNr和每天的价值。

这可能吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您可以使用LAG function访问同一订单的上一行,然后计算差异:

SELECT t.Date, 
    t.OrderNr, 
    t.TotalDelivered,
    t.TotalDelivered - t.PreviousDelivered as DeliveredToday
FROM
    (SELECT 
        Date, 
        OrderNr, 
        TotalDelivered,
        LAG(TotalDelivered, 1, 0) OVER (PARTITION BY OrderNr ORDER BY Date ASC) AS PreviousDelivered
    FROM tableName
    ) t

在子查询中,我使用函数LAG来获取同一订单的TotalDelivered的先前值(由PARTITION BY OrderNr指定)并按日期排序(ORDER BY Date ASC )。然后在外部查询中,我从PreviousDelivered中减去TotalDelivered的值,结果是今天交付的数量。

编辑:在评论中提及@SandipPatel时,可能不使用子查询:

SELECT 
        Date, 
        OrderNr, 
        TotalDelivered,
        TotalDelivered-LAG(TotalDelivered, 1, 0) OVER (PARTITION BY OrderNr ORDER BY Date ASC) AS PreviousDelivered
FROM tableName