Postgresql: обновить старую запись, когда новая вставляется с условием времени - PullRequest
0 голосов
/ 23 апреля 2019

Итак, у меня есть таблица postgresql, в которую я продолжаю добавлять новые записи с другим элементом

item      period                     cost    cost_diff
---------------------------------------------------------
 bag    2019-03-15T18:15:00.000Z     100         0
 shoe   2019-03-15T18:15:00.000Z     200         0

Итак, когда поступают записи, их cost_diff будет 0. Но когда придет новая, вот так

item      period                     cost    cost_diff
---------------------------------------------------------
 bag    2019-03-15T18:15:00.000Z     100         0
 shoe   2019-03-15T18:15:00.000Z     200         0
 bag    2019-03-15T18:30:00.000Z     150         0
 shoe   2019-03-15T18:45:00.000Z     300         0

Значение cost_diff старой записи будет обновлено с помощью (новая стоимость - старая стоимость), но оно будет обновлено тогда и только тогда, когда период будет равен следующим 15 минутам, в которые данные будут вставлены в момент времени 0, 15. 30 и 45 минут.

item      period                     cost    cost_diff
---------------------------------------------------------
 bag    2019-03-15T18:15:00.000Z     100        50 (150-100)
 shoe   2019-03-15T18:15:00.000Z     200         0 (no update)
 bag    2019-03-15T18:30:00.000Z     150         0
 shoe   2019-03-15T18:45:00.000Z     300         0

В приведенной выше таблице показано, что вставляется более новая запись для пакета с диапазоном 15 минут (18: 15-> 18:30), поэтому строка пакета с периодом 18:15 обновит столбец cost_diff до 50 от стоимости из 18:30 минус со стоимостью с 18:15, которая будет 150 - 50 = 100. Хотя старый ряд обуви не будет обновлен (по-прежнему 0), потому что более новая запись обуви не наступит в следующие 15 минут (18:15 -> 18:45), и это будет обновление, когда строка обуви с периодом 18:30 вставляется в таблицу и так далее для других записей (есть много предметов, не только шоу и сумка, как показано).

Итак, как я могу создать базу запросов по этой проблеме, поскольку запись будет продолжать поступать в эту таблицу, может ли это быть сделано исключительно с помощью SQL-запроса или мне нужно использовать Python, чтобы помочь с этим (я делаю конвейер etl, в котором эта задача включена в процесс преобразования)

Спасибо

1 Ответ

0 голосов
/ 23 апреля 2019

Вы можете сделать это с помощью запроса. Используйте lead():

select t.*,
       (case when lead(period) over (partition by item order by period) < period + interval '15 minute'
             then lead(cost) over (partition by item order by period) - cost
             else 0
       ) as cost_diff
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...