Rumah >pangkalan data >tutorial mysql >Bagaimana Menggunakan Fungsi Tetingkap dengan Fungsi Agregat dalam Postgres dengan Betul untuk Mengira Untung/Rugi Terkumpul?
Postgres menyediakan fungsi tetingkap untuk menganalisis data merentas partition yang berbeza. Walau bagaimanapun, menggabungkannya dengan fungsi pengagregatan boleh menyebabkan kekeliruan dan ralat.
Dalam pertanyaan yang diberikan, pengguna cuba mengira keuntungan/kerugian terkumpul untuk pengguna dari semasa ke semasa, tetapi menghadapi ralat:
ERROR: column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
Ralat ini timbul kerana fungsi SUM yang digunakan untuk sp.payout dan s.buyin sebenarnya adalah fungsi tetingkap kerana klausa OVER. Fungsi tetingkap menyimpan semua baris sambil mengagregatkan nilai dalam partition.
Untuk menyelesaikan masalah ini, agregat data dahulu, kemudian gunakan nilai agregat dalam fungsi tetingkap. Dalam kes ini, kita boleh mengira jumlah pembayaran dan pembelian untuk setiap acara:
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 AS p JOIN result AS r ON r.player_id = p.player_id JOIN game AS g ON g.game_id = r.game_id JOIN event AS e ON e.event_id = g.event_id JOIN structure AS s ON s.structure_id = g.structure_id JOIN structure_payout AS 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;
Di sini, SUM luar berfungsi nilai agregat merentas semua hasil dalam acara, dan fungsi tetingkap kemudian mengira keuntungan terkumpul /kehilangan.
Atas ialah kandungan terperinci Bagaimana Menggunakan Fungsi Tetingkap dengan Fungsi Agregat dalam Postgres dengan Betul untuk Mengira Untung/Rugi Terkumpul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!