Rumah > pangkalan data > tutorial mysql > Bagaimana Menggunakan Fungsi Tetingkap dengan Fungsi Agregat dalam Postgres dengan Betul untuk Mengira Untung/Rugi Terkumpul?

Bagaimana Menggunakan Fungsi Tetingkap dengan Fungsi Agregat dalam Postgres dengan Betul untuk Mengira Untung/Rugi Terkumpul?

DDD
Lepaskan: 2025-01-06 11:07:44
asal
762 orang telah melayarinya

How to Correctly Use Window Functions with Aggregate Functions in Postgres to Calculate Cumulative Profit/Loss?

Fungsi Tetingkap Postgres dan Kumpulan Mengikut Pengecualian

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
Salin selepas log masuk

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;
Salin selepas log masuk

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!

Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan