Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan PostgreSQL Saya Menjana 'lajur 'sp.payout' mesti muncul dalam klausa GROUP BY' Ralat Apabila Menggunakan Fungsi Tetingkap?

Mengapa Pertanyaan PostgreSQL Saya Menjana 'lajur 'sp.payout' mesti muncul dalam klausa GROUP BY' Ralat Apabila Menggunakan Fungsi Tetingkap?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-06 11:19:46930semak imbas

Why Does My PostgreSQL Query Generate a

Fungsi Tetingkap dan Kumpulan Mengikut Pengecualian dalam PostgreSQL

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.

Fungsi Agregat Yang Tidak Dikenalpasti

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.

Menggunakan Fungsi Tetingkap

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.

Menggabungkan Fungsi Tetingkap dan Agregat

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 Semakan

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;

Penjelasan

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.

Mata Utama

  • Fungsi tetingkap mengumpul nilai agregat pada satu julat yang ditentukan, mengekalkan semua baris selepas operasi.
  • Fungsi agregat digunakan dahulu apabila menggabungkan fungsi tetingkap dan agregat.
  • Menggunakan jenis fungsi yang betul (tetingkap atau agregat) adalah penting untuk pelaksanaan pertanyaan yang betul.

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!

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