Могу ли я сравнить поля из другой строки в той же таблице - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть таблица, в которой количество строк генерируется в каждом заказе.Таким образом, вместо кол-во в каждом ящике у меня есть:

  • Кол-во 2 = Кол-во Box1 + Кол-во Box2
  • Кол-во Box 3 = Кол-во Box2 + Кол-во Box3 и т.д. ...

Я нашел способ рассчитать Кол-во на ящик в Excel по следующей формуле:

= IF(Line2(Order)=Line1(Order) THEN (Line2(Qty)-Line1(Qty) ELSE Line2(Qty) 

Но мне было интересно, возможно ли это сделать в Oracle.

Текущая таблица:

SELECT ORDER, BOX, QTY
FROM TABLE

     ORDER        BOX        QTY
---------- ---------- ----------
     12345       4501         50
     12345       4502        100
     12345       4503        150
     12345       4504        200
     12345       4505        250
     12354       5401         40
     12354       5402        100
     12354       5403        160
     12354       5404        220
     12360       6001         20
     12360       6002         42
     12360       6003         62

Ожидаемый результат:

     ORDER        BOX        QTY
---------- ---------- ----------
     12345       4501         50
     12345       4502         50
     12345       4503         50
     12345       4504         50
     12345       4505         50
     12354       5401         40
     12354       5402         60
     12354       5403         60
     12354       5404         60
     12360       6001         20
     12360       6002         22
     12360       6003         20

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Да, вам нужна функция lag(), которая смотрит в предыдущую строку:

демо

select order_, box, qty, 
       qty - nvl(lag(qty) over (partition by order_ order by box), 0) 
  from tbl
0 голосов
/ 15 февраля 2019

Используйте аналитическую функцию LAG ().

select order_no
       , box_no
       , qty
       , nvl(qty-lag(qty) over (partition by order_no order by box), qty) as box_qty
from orders
order by 1 , 2
/

Предполагается, что (order_no, box) - это ваш уникальный ключ, а присвоение box - это возрастающий ряд в пределах order_no.Если ваши действительные правила отличаются, вам нужно будет пересмотреть предложение окна.

...