#python #sql #python-3.x #dataframe #presto
Вопрос:
У меня есть столик:
date id action value
2021-09-02 aa income 500
2021-09-02 aa spending 500
2021-09-02 aa spending 45
2021-09-03 aa income 30
2021-09-03 aa income 30
2021-09-03 aa spending 25
2021-09-04 b1 income 100
2021-09-05 b1 income 500
2021-09-05 b1 spending 500
2021-09-05 b1 spending 45
2021-09-06 b1 income 30
2021-09-06 b1 income 30
2021-09-07 b1 spending 25
Как вы видите, существует 2 вида действий: «доходы» и «расходы». Я хочу добавить столбец с накоплением «значения» в каждый момент для каждого идентификатора. И после каждого действия «доход» должен увеличиваться на величину этого «дохода», а когда есть «расходы», он должен уменьшаться на величину этого уменьшения. Поэтому результат должен выглядеть так:
date id action value saved
2021-09-02 aa income 500 0
2021-09-02 aa spending 400 500
2021-09-02 aa spending 40 100
2021-09-03 aa income 30 60
2021-09-03 aa income 30 90
2021-09-03 aa spending 25 120
2021-09-04 b1 income 100 0
2021-09-05 b1 income 500 100
2021-09-05 b1 spending 500 600
2021-09-05 b1 spending 45 100
2021-09-06 b1 income 30 55
2021-09-06 b1 income 30 85
2021-09-07 b1 spending 25 115
Как это сделать? Я тоже не против сделать это с Python
Комментарии:
1. Как вы определяете порядок? Используйте совокупную сумму с выражением регистра для знака.
Ответ №1:
Предполагая, что значение может быть преобразовано в отрицательное, если оно совпадает с расходами, итоговая сумма может быть рассчитана с помощью оконной функции следующим образом:
SELECT date,action,value,
SUM(CASE WHEN action = 'spending' THEN -1*value ELSE value END) OVER (ORDER BY date)
AS saved
FROM table;
Вы также можете найти этот ресурс в разделе LearnSQL об использовании.
Изменить: Я обновил приведенный выше запрос, включив в него СЛУЧАЙ, вложенный в функцию окна; т. Е. Преобразуйте значения в отрицательные, где категория «Расходы», а затем рассчитайте текущую сумму.
Комментарии:
1. спасибо, но это не приносит 0 для «сохранения» изначально
Ответ №2:
select *
, case when row_number() over (order by date) = 1 then 0
else sum(case when action = 'spending' then -value else value end) over (order by date) end as save
from table
Комментарии:
1. спасибо, но это не приносит 0 для «сохранения» изначально
2. @french_fries см. обновленный ответ