Tôi nghĩ rằng vấn đề chính là bạn đang trộn các thao tác được sử dụng trong chú thích tạo ra một tập hợp truy vấn được nhóm lại chẳng hạn như tính tổng với một thao tác đơn giản tạo trường mới cho mỗi bản ghi trong tập truy vấn đã cho, chẳng hạn như yesterday_count=Window(expression=Lag("count"))
.
Vì vậy, đặt hàng thực sự quan trọng ở đây. Vì vậy, khi bạn thử:
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))
Bộ truy vấn kết quả chỉ đơn giản là chú thích WidgetCount.objects.distinct ("ngày"), không có nhóm nào được hoàn thiện.
Tôi khuyên bạn nên tách các hoạt động của bạn để dễ hiểu hơn những gì đang xảy ra và lưu ý rằng bạn đang lặp lại đối tượng python nên không cần thực hiện bất kỳ truy vấn mới nào!
Lưu ý khi sử dụng thao tác SUM chẳng hạn vì tôi gặp lỗi không mong muốn với toán tử FirstValue. Vì vậy, tôi đăng bài với Sum để chứng minh ý tưởng vẫn giữ nguyên. Ý tưởng phải giống nhau đối với giá trị đầu tiên chỉ bằng cách thay đổi acc_count=Sum("count")
thành 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)
ĐẦU RA:
{'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}
Hóa ra toán tử FirstValue yêu cầu sử dụng một hàm Windows để bạn không thể lồng FirtValue và sau đó tính toán Lag, vì vậy trong trường hợp này, tôi không chắc bạn có thể thực hiện được hay không. Câu hỏi trở thành cách truy cập cột First_Value mà không lồng các cửa sổ.