Вычитание значения из предыдущей строки sql по группам - PullRequest
0 голосов
/ 29 мая 2019

У меня есть следующий набор данных:

DATA_FIM    CENTRO  C   M   ESTOQUE
2018-02-01  HD01    CD  70  539.000
2018-03-01  HD01    CD  70  511.000
2018-04-01  HD01    CD  70  468.000
2018-05-01  HD01    CD  70  447.000
2018-06-01  HD01    CD  70  382.000
2018-07-01  HD01    CD  70  348.000
2018-08-01  HD01    CD  70  285.000
2018-09-01  HD01    CD  70  245.000
2018-10-01  HD01    CD  70  221.000
2018-11-01  HD01    CD  70  207.000
2018-12-01  HD01    CD  70  122.000
2018-12-21  HD01    CD  70  101.000
2018-02-01  HD01    CD  71  164.000
2018-03-01  HD01    CD  71  147.000
2018-04-01  HD01    CD  71  124.000
2018-05-01  HD01    CD  71  107.000
2018-06-01  HD01    CD  71  78.000

1- Учитывая 2-й, 3-й, 4-й столбцы как группу, я хочу вычесть значения 5-го столбца из предыдущей строки того же столбца.

Чтобы создать новую строку.

[! [Data] [2]] [2]

Это очень похоже на эту проблему: [Issue: 13196190] [3]Однако в моем случае у меня есть несколько индексов, и я не уверен, как решить.

ОБНОВЛЕНО

Я использую предложенные коды

select 
ZBI_FAT_PRODUCT.DATA_FIM,
        ZBI_DIM_EMPRESA.CENTRO, 
        ZBI_DIM_EMPRESA.CANAL, 
        ZBI_DIM_PRODUCT.MATERIAL, 
        ZBI_DIM_PRODUCT.TITULO,
        ZBI_FAT_PRODUCT.ESTOQUE_VENDA, 
        LAG(ZBI_FAT_PRODUCT.ESTOQUE_VENDA, 1, ZBI_FAT_PRODUCT.ESTOQUE_VENDA) OVER (PARTITION BY ZBI_DIM_EMPRESA.CENTRO, ZBI_DIM_PRODUCT.MATERIAL, ZBI_DIM_PRODUCT.TITULO ORDER BY ZBI_FAT_PRODUCT.DATA_FIM) - ZBI_FAT_PRODUCT.ESTOQUE_VENDA AS NEW
FROM ZBI_DIM_EMPRESA INNER JOIN (ZBI_DIM_PRODUCT INNER JOIN ZBI_FAT_PRODUCT ON ZBI_DIM_PRODUCT.BK = ZBI_FAT_PRODUCT.BK_MATERIAL) ON ZBI_DIM_EMPRESA.BK = ZBI_FAT_PRODUCT.BK_EMPRESA;

Ответы [ 2 ]

4 голосов
/ 29 мая 2019

Вы, кажется, просто хотите lag():

select el.*,
       (lag(estoque, 0, estoque) over (partition by centro, c, m order by date_mif) -
        estoque
       ) as diff
from energylog el;

РЕДАКТИРОВАТЬ:

Для отредактированного вопроса, кажется, только два столбца составляют группу

select el.*,
       (lag(estoque, 0, value) over (partition by centro, canal, order by date_mif) -
        estoque
       ) as diff
from energylog el;
1 голос
/ 29 мая 2019

Для краткости и извлечения решения из комментариев -

Ответ заключается в использовании функции LAG():

SELECT *, 
LAG(ESTOQUE, 1, ESTOQUE) OVER (PARTITION BY CENTRO, C, M ORDER BY DATA_FIM) - ESTOQUE AS New
FROM EnergyLog

Вот пример этой работы: SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...