Мисля, че основният проблем е, че смесвате операции, които се използват в анотация, генерира групиран набор от заявки, като 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, така че не е необходимо да правите нови заявки!
Забележка при използването на операция SUM като пример, защото получавам неочаквана грешка с оператора FirstValue. Така че публикувам със 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 без вложени прозорци.