Я думаю, что основная проблема в том, что вы смешиваете операции, которые используются в аннотации, генерирует сгруппированный набор запросов, такой как 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. Поэтому я пишу с Сум, чтобы продемонстрировать идею, которая остается той же. Идея должна быть такой же для первого значения, просто изменив 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 без вложенности windows.