Saya pikir masalah utamanya adalah Anda mencampur operasi yang digunakan dalam anotasi menghasilkan kumpulan kueri yang dikelompokkan seperti jumlah dengan operasi yang sederhana membuat bidang baru untuk setiap catatan dalam kumpulan kueri yang diberikan seperti yesterday_count=Window(expression=Lag("count"))
.
Jadi Memesan sangat penting di sini. Jadi ketika Anda mencoba:
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))
Kumpulan kueri hasil hanyalah anotasi WidgetCount.objects.distinct("date"), tidak ada pengelompokan yang dilakukan.
Saya akan menyarankan untuk memisahkan operasi Anda sehingga menjadi lebih mudah untuk memahami apa yang terjadi, dan perhatikan Anda mengulangi objek python jadi tidak perlu membuat pertanyaan baru!
Perhatikan dalam menggunakan operasi SUM sebagai contoh karena saya mendapatkan kesalahan tak terduga dengan operator FirstValue. Jadi saya memposting dengan Sum untuk menunjukkan ide yang tetap sama. Idenya harus sama untuk nilai pertama hanya dengan mengubah acc_count=Sum("count")
ke 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)
KELUARAN:
{'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}
Ternyata operator FirstValue perlu menggunakan fungsi Windows sehingga Anda tidak dapat membuat sarang FirtValue dan kemudian menghitung Lag, jadi dalam skenario ini saya tidak yakin apakah Anda bisa melakukannya. Pertanyaannya adalah bagaimana mengakses kolom First_Value tanpa jendela bersarang.