Rumah >pangkalan data >tutorial mysql >Bagaimana Menggunakan Fungsi Tetingkap dengan betul dengan GROUP BY dalam Postgres untuk Mengira Statistik Pengguna Terkumpul?

Bagaimana Menggunakan Fungsi Tetingkap dengan betul dengan GROUP BY dalam Postgres untuk Mengira Statistik Pengguna Terkumpul?

Linda Hamilton
Linda Hamiltonasal
2025-01-06 11:12:40928semak imbas

How to Correctly Use Window Functions with GROUP BY in Postgres to Calculate Cumulative User Statistics?

Fungsi Tetingkap Postgres dan Kumpulan Mengikut Pengecualian

Masalah

Pertanyaan sedang berusaha untuk mendapatkan semula statistik pengguna terkumpul dari semasa ke semasa, tetapi ia menghadapi ketidaktepatan. Apabila berbilang permainan wujud dalam acara, pertanyaan menghasilkan berbilang baris untuk pembayaran yang berbeza. Penyelesaian yang jelas untuk mengumpulkan mengikut ID acara gagal, menyebabkan ralat: "lajur "sp.payout" mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat."

Penyelesaian

Ralat timbul kerana pertanyaan menggunakan fungsi tetingkap, yang mengagregat nilai setiap partition sambil mengekalkan semua baris, sebaliknya daripada fungsi agregat. Fungsi tetingkap memerlukan hujahnya untuk dimasukkan ke dalam klausa GROUP BY.

Untuk menyelesaikan isu, seseorang boleh menggabungkan fungsi tetingkap dan agregat seperti berikut:

SELECT p.name
     , e.event_id
     , e.date
     , sum(sum(sp.payout)) OVER w
     - sum(sum(s.buyin  )) OVER w AS "Profit/Loss" 
FROM   player            p
JOIN   result            r ON r.player_id     = p.player_id  
JOIN   game              g ON g.game_id       = r.game_id 
JOIN   event             e ON e.event_id      = g.event_id 
JOIN   structure         s ON s.structure_id  = g.structure_id 
JOIN   structure_payout sp ON sp.structure_id = g.structure_id
                          AND sp.position     = r.position
WHERE  p.player_id = 17 
GROUP  BY e.event_id
WINDOW w AS (ORDER BY e.date, e.event_id)
ORDER  BY e.date, e.event_id;

Penjelasan

Dalam pertanyaan ini, fungsi outer sum() ialah fungsi tetingkap yang mengira jumlah fungsi jumlah dalam (). Fungsi dalaman mengagregatkan pembayaran dan pembelian untuk setiap pemain dalam setiap acara. Hasilnya ialah satu baris bagi setiap pemain dan acara, memaparkan keuntungan atau kerugian terkumpul.

Pertimbangan Tambahan

  • Untuk memasukkan berbilang pemain, gantikan klausa WHERE dengan : WHERE p.player_id < 17.
  • Jika p.name bukan unik, kumpulan dan susunan mengikut player_id tambahan untuk hasil yang betul.
  • Penghimpunan mengikut tarikh e.tarikh dan p.name mungkin menghasilkan faedah prestasi.

Atas ialah kandungan terperinci Bagaimana Menggunakan Fungsi Tetingkap dengan betul dengan GROUP BY dalam Postgres untuk Mengira Statistik Pengguna Terkumpul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn