Django ORM, суммирование значений столбцов через запрос
У меня есть таблица со следующими значениями:
user | сумма | дата |
---|---|---|
Джон | 10 | 2017-07-01 |
Джон | 20 | 2019-07-01 |
Джон | 30 | 2020-09-01 |
Джон | 40 | 2021-11-01 |
... | ... | ... |
Dan | -20 | 2019-02-01 |
Dan | -30 | 2020-04-01 |
Dan | -40 | 2021-06-01 |
Входом функции является диапазон даты, например, следующим образом:
date_start = '2019-01-01'
date_end = '2021-11-07'
Ожидаемый результат:
Для всех пользователей, для каждой даты в этом диапазоне дат, я хочу вернуть sum
из amounts
, от текущей даты до всех предыдущих дат, как это:
user | сумма | дата |
---|---|---|
Джон | 30 (10+20) |
2019-07-01 |
Джон | 60 (10+20+30) |
2020-09-01 |
Джон | 100 (10+20+30+40) |
2021-11-01 |
... | ... | ... |
Dan | -20 | 2019-02-01 |
Дан | -50 (-20-30) |
2020-04-01 |
Дан | -90 (-20-30-40) |
2021-06-01 |
Мои усилия
def get_sum_amount(self, date_start=None, date_end=None):
date_detail = {}
# Minimum date
if date_start:
date_detail['date__gt'] = date_start
# Maximum date
if date_end:
date_detail['date__lt'] = date_end
detail = Financial.objects.filter(Q(**date_detail)) \
.values('user') \
.annotate(sum_amount=Coalesce(Sum(F('amount')), Value(0)))
но результата нет.
Вы можете использовать функции Window
с разделом onuser
для запуска кумулятивной суммы по каждому пользователю, упорядоченной по дате:
detail = Financial.objects.filter(**date_detail).annotate(
running_amount=Window(
expression=Sum('amount'),
partition_by=[F('user')],
order_by=F('date').asc(),
)
)