主な問題は、アノテーションで使用される操作が、sumなどのグループ化されたクエリセットを生成する操作と、yesterday_count=Window(expression=Lag("count"))
。
したがって、ここでは順序付けが非常に重要です。したがって、試してみると:
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))
結果のクエリセットは、単にWidgetCount.objects.distinct( "date")に注釈が付けられており、グループ化は実行されません。
何が起こっているのかを理解しやすくするために操作を分離することをお勧めします。Pythonオブジェクトを繰り返し処理しているので、新しいクエリを作成する必要はありません。
FirstValue演算子で予期しないエラーが発生するため、例としてSUM操作を使用する場合の注意。だから私はSumと一緒に投稿して、同じままのアイデアを示しています。 acc_count=Sum("count")
を変更するだけで、最初の値の考え方は同じになります。 first_count=FirstValue("count")
へ
for truncDate_groups in Row.objects.annotate(trunc_date=Trunc('time','day')).values("trunc_date")\
.annotate(acc_count=Sum("count")).values("acc_count","trunc_date")\
.order_by('trunc_date')\
.annotate(y_count=Window(Lag("acc_count")))\
.values("trunc_date","acc_count","y_count"):
print(truncDate_groups)
出力:
{'trunc_date': datetime.datetime(2020, 1, 20, 0, 0, tzinfo=<UTC>), 'acc_count': 65, 'y_count': None}
{'trunc_date': datetime.datetime(2020, 1, 21, 0, 0, tzinfo=<UTC>), 'acc_count': 75, 'y_count': 162}
{'trunc_date': datetime.datetime(2020, 1, 22, 0, 0, tzinfo=<UTC>), 'acc_count': 162, 'y_count': 65}
FirstValue演算子はWindows関数を使用する必要があるため、FirtValueをネストしてからLagを計算できないことが判明したため、このシナリオでは、それができるかどうか正確にはわかりません。問題は、ウィンドウをネストせずにFirst_Value列にアクセスする方法です。