PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Anotasi Jendela Django menggunakan kombinasi dengan klausa berbeda

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyetel batas waktu koneksi dengan PDO

  2. Non-superuser tidak dapat terhubung jika server tidak meminta kata sandi saat menggunakan dblink

  3. Membandingkan Load Balancer untuk PostgreSQL

  4. Dapatkan jumlah catatan yang terpengaruh oleh INSERT atau UPDATE di PostgreSQL

  5. Sisipan/pembaruan massal Postgres yang aman untuk injeksi. Mungkin fungsi yang menggunakan array?