【发布时间】:2020-07-27 18:28:04
【问题描述】:
我有一个存储在 Postgres 数据库中的 Django 模型,其中包含不规则间隔的计数值:
WidgetCount
- Time
- Count
我正在尝试使用带有 Lag 的窗口函数来为我提供前一行的值作为注释。我的问题是当我尝试将它与一些不同的日期截断结合起来时,窗口函数使用源行而不是明确分组的行。
例如,如果我有以下行:
time count
2020-01-20 05:00 15
2020-01-20 06:00 20
2020-01-20 09:00 30
2020-01-21 06:00 35
2020-01-21 07:00 40
2020-01-22 04:00 50
2020-01-22 06:00 54
2020-01-22 09:00 58
我想返回一个显示每天第一次阅读的查询集,我可以使用:
from django.db.models.functions import Trunc
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"))
这给了我:
date count
01/01/20 15
01/01/21 35
01/01/22 50
我想添加一个注释,给出昨天的值(这样我就可以显示每天的变化)。
date count yesterday_count
01/01/20 15
01/01/21 35 15
01/01/22 50 35
如果我这样做:
from django.db.models.functions import Trunc, Lag
from django.db.models import Window
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))
第二行返回给我 30 表示昨天的计数 - 即,它在应用 distinct 子句之前向我显示了前一行。
如果我添加这样的分区子句:
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count"), partition_by=F("date")))
那么昨天的计数对于所有行都是无。
如果需要,我可以在 Python 中进行此计算,但这让我有点抓狂,我想知道我正在尝试做的事情是否可行。
谢谢!
【问题讨论】:
标签: django postgresql django-orm