Jeg tror, at hovedproblemet er, at du blander operationer, der bruges i annotering genererer et grupperet forespørgselssæt såsom sum med en operation, der simpelt hen opretter et nyt felt for hver post i det givne forespørgselssæt såsom yesterday_count=Window(expression=Lag("count"))
.
Så bestilling betyder virkelig noget her. Så når du prøver:
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))
Resultatforespørgselssættet er blot WidgetCount.objects.distinct("dato") annoteret, ingen gruppering udføres.
Jeg vil foreslå, at du afkobler dine operationer, så det bliver nemmere at forstå, hvad der sker, og bemærker, at du itererer over python-objektet, så du behøver ikke foretage nye forespørgsler!
Bemærk at bruge SUM-operation som eksempel, fordi jeg får en uventet fejl med FirstValue-operatoren. Så jeg poster med Sum for at demonstrere ideen, som forbliver den samme. Ideen skal være den samme for første værdi blot ved at ændre acc_count=Sum("count")
til 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)
OUTPUT:
{'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}
Det viser sig, at FirstValue-operatøren kræver at bruge en Windows-funktion, så du ikke kan indlejre FirtValue og derefter beregne Lag, så i dette scenarie er jeg ikke helt sikker på, om du kan gøre det. Spørgsmålet bliver, hvordan man får adgang til First_Value-kolonnen uden indlejrede vinduer.