Поочередно вычесть и перезаписать строки в выборочных столбцах
Всем привет! есть такая табличка, в которой логируются действия по изменению состава корзины. Описание полей:
- cartcode - id корзины
- p_productcode - артикул добавления(к примеру детская игрушка)
- p_productadditiontype - тип изменения состава корзины ( может быть, добавление ADD, изменение EDIT и удаление REMOVE
- income - оборот в рублях
- goods - кол-во штук
- product - раздел сайта где было совершенно одно из действий по изменению.
Необходимо в разрезе cartcode и p_productcode с учетом очередности по добавлению(по created_time) провести вычитание по столбцам income и goods(скомпенсировать добавленные и удаленные значения), да так что если в этих строках при удаление может получится значение меньше нуля, надо записать 0, и продолжить вычитать из следующей строки согласно разрезу по cartcode и p_productcode.
Исходные данные:
dy | created_time | p_type | cl_type | cartcode | p_productcode | p_productadditiontype | income | goods | product |
---|---|---|---|---|---|---|---|---|---|
2023-08-16 | 12:40:03 | 300 | Юр.Лицо | 1234 | 1255 | ADD | 500 | 5 | Поиск |
2023-08-16 | 12:41:04 | 400 | Юр.Лицо | 1234 | 1633 | ADD | 300 | 2 | Витрина |
2023-08-16 | 12:42:05 | 301 | Юр.Лицо | 1234 | 1255 | EDIT | 300 | 3 | Личный кабинет |
2023-08-16 | 12:43:06 | 555 | Юр.Лицо | 1234 | 1255 | EDIT | -600 | -6 | Чекаут |
2023-08-16 | 12:44:07 | 346 | Юр.Лицо | 1234 | 1633 | REMOVE | -150 | -1 | Чекаут |
То что должно получится :
dy | created_time | p_type | cl_type | cartcode | p_productcode | p_productadditiontype | income | goods | product |
---|---|---|---|---|---|---|---|---|---|
2023-08-16 | 12:40:03 | 300 | Юр.Лицо | 1234 | 1255 | ADD | 0 | 0 | Поиск |
2023-08-16 | 12:41:04 | 400 | Юр.Лицо | 1234 | 1633 | ADD | 150 | 1 | Витрина |
2023-08-16 | 12:42:05 | 301 | Юр.Лицо | 1234 | 1255 | EDIT | 200 | 2 | Личный кабинет |
2023-08-16 | 12:43:06 | 555 | Юр.Лицо | 1234 | 1255 | EDIT | 0 | 0 | Чекаут |
2023-08-16 | 12:44:07 | 346 | Юр.Лицо | 1234 | 1633 | REMOVE | 0 | 0 | Чекаут |
Алгоритм - смотрим связку cartcode и p_productcode соответственно 1234 и 1255 , ищем первый минус по столбцам income и goods опять же в группе cartcode и p_productcode начинаем компенсировать положительные и отрицательные значения согласно сортировки по дате и времени до 0 если это возможно, в данном случае значения первой строки компенсируются в 0, тк 500-600=-100, эти -100 мы дальше по порядку вычитаем из следующего положительного значения в группе cartcode и p_productcode это 300, 300-100=200, 200 и записывается. А то первое отрицательное значение -600, скомпенсировалось в 0. Если бы отрицательных значений было бы больше , мы бы их вычитали по той же логике(т.е. по порядку до 0 и переходили бы к следующей строке)