我有一個包含以下值的表:
| 用戶 | 數量 | 日期 |
|---|---|---|
| 約翰 | 10 | 2017-07-01 |
| 約翰 | 20 | 2019-07-01 |
| 約翰 | 30 | 2020-09-01 |
| 約翰 | 40 | 2021-11-01 |
| ... | ... | ... |
| 擔 | -20 | 2019-02-01 |
| 擔 | -30 | 2020-04-01 |
| 擔 | -40 | 2021-06-01 |
該函式的輸入是一個日期范圍,例如如下:
date_start = '2019-01-01'
date_end = '2021-11-07'
預期輸出:
對于所有用戶,對于此日期范圍內的每個日期,我想sum將amounts, 從當前日期回傳到所有以前的日期,如下所示:
| 用戶 | 數量 | 日期 |
|---|---|---|
| 約翰 | 30 (10 20) |
2019-07-01 |
| 約翰 | 60 (10 20 30) |
2020-09-01 |
| 約翰 | 100 (10 20 30 40) |
2021-11-01 |
| ... | ... | ... |
| 擔 | -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)))
但沒有結果。
更新
上述示例的函式輸出為:
| 用戶 | 數量 |
|---|---|
| 約翰 | 100 |
| 擔 | -90 |
uj5u.com熱心網友回復:
您可以使用Window帶有磁區的函式user來運行每個用戶的累積總和,按日期排序:
detail = Financial.objects.filter(**date_detail).annotate(
running_amount=Window(
expression=Sum('amount'),
partition_by=[F('user')],
order_by=F('date').asc(),
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/351587.html
標籤:姜戈 django-models django-queryset django-orm django-注释
