Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan PostgreSQL Saya Menjana 'lajur 'sp.payout' mesti muncul dalam klausa GROUP BY' Ralat Apabila Menggunakan Fungsi Tetingkap?
Dalam pertanyaan ini, matlamatnya adalah untuk mengira keuntungan/kerugian terkumpul untuk pengguna tertentu dari semasa ke semasa. Walau bagaimanapun, percubaan awal menghadapi ralat disebabkan salah faham tentang sifat fungsi tetingkap dalam PostgreSQL.
Mesej ralat "lajur "sp.payout" mesti muncul dalam KUMPULAN OLEH klausa atau digunakan dalam fungsi agregat" menunjukkan bahawa PostgreSQL menjangkakan lajur sp.payout dan s.buyin untuk dimasukkan ke dalam klausa GROUP BY kerana ia digunakan dalam fungsi agregat sum(). Walau bagaimanapun, ini adalah pengecaman yang salah.
Dalam pertanyaan ini, sum() sedang digunakan sebagai fungsi tetingkap, bukan fungsi agregat. Fungsi tetingkap, tidak seperti fungsi agregat, nilai agregat dalam julat yang ditentukan, tetapi ia mengekalkan semua baris individu selepas operasi. Ini adalah perbezaan ketara yang andaian pertanyaan yang salah tentang fungsi agregat terlepas pandang.
Penyelesaian adalah dengan mengenal pasti dan menggunakan fungsi tetingkap dengan betul. PostgreSQL membenarkan gabungan fungsi tetingkap dan agregat, dengan fungsi agregat digunakan terlebih dahulu.
Pertanyaan yang disemak menggabungkan pemahaman ini:
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;
Jumlah luar() dalam ungkapan ini (sum(sum(sp.payout)) OVER w) ialah fungsi tetingkap, manakala inner sum() ialah fungsi agregat. Fungsi agregat menjumlahkan nilai pembayaran dan belian dalam setiap peristiwa, dan fungsi tetingkap kemudiannya menjumlahkan hasil agregat ini ke atas julat yang ditentukan.
Atas ialah kandungan terperinci Mengapa Pertanyaan PostgreSQL Saya Menjana 'lajur 'sp.payout' mesti muncul dalam klausa GROUP BY' Ralat Apabila Menggunakan Fungsi Tetingkap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!