Rumah > pangkalan data > tutorial mysql > Bagaimanakah Klausa `KEEP` Mempengaruhi `PARTITITION BY` dalam Pertanyaan Agregat Oracle?

Bagaimanakah Klausa `KEEP` Mempengaruhi `PARTITITION BY` dalam Pertanyaan Agregat Oracle?

Mary-Kate Olsen
Lepaskan: 2025-01-05 04:06:44
asal
193 orang telah melayarinya

How Does the `KEEP` Clause Affect `PARTITION BY` in Oracle Aggregate Queries?

PARTITION BY dengan dan tanpa KEEP dalam Oracle

Dalam Oracle, klausa PARTITION BY membolehkan pembahagian data kepada kumpulan yang berbeza untuk tujuan tersebut menggunakan fungsi agregat. Ia selalunya bermanfaat untuk membahagikan data untuk pengoptimuman prestasi atau pengumpulan logik.

Klausa PARTITION BY boleh digunakan dengan atau tanpa kata kunci KEEP. Apabila KEEP tidak digunakan, keseluruhan partition digunakan untuk pengagregatan. Sebaliknya, apabila KEEP digunakan, hanya baris yang memenuhi syarat tertentu dikekalkan untuk pengagregatan.

Untuk menggambarkan perbezaan, pertimbangkan dua pertanyaan berikut:

Pertanyaan 1 tanpa KEEP :

SELECT deptno, MIN(sal) OVER (PARTITION BY deptno) AS "Lowest", MAX(sal) OVER (PARTITION BY deptno) AS "Highest"
FROM empl
Salin selepas log masuk

Pertanyaan 2 dengan KEEP:

SELECT deptno, MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest", MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS "Highest"
FROM empl
Salin selepas log masuk

Query 2 menggunakan klausa KEEP untuk memulangkan hanya gaji peringkat pertama dan terakhir untuk setiap jabatan (menggunakan fungsi DENSE_RANK). Kesan keseluruhan adalah untuk menghapuskan nilai pendua dan menyediakan gaji minimum dan maksimum yang berbeza.

Untuk menghuraikan lebih lanjut:

  • OVER (PARTITION BY deptno): Partition the data berdasarkan lajur deptno.
  • PESAN OLEH sal: Menyusun baris dalam setiap partition mengikut gaji dalam tertib menaik.
  • KEEP (DAFTAR_PADAT): Mengekalkan hanya baris kedudukan pertama untuk setiap partition. Fungsi DENSE_RANK memberikan kedudukan berturut-turut yang unik kepada baris, dengan nilai yang sama berkongsi kedudukan yang sama.
  • MIN(sal): Mengira gaji minimum untuk baris yang dikekalkan dalam setiap partition.
  • MAX(sal): Mengira maksimum gaji untuk baris yang dikekalkan dalam setiap partition.

Dalam pertanyaan kedua, MIN dan DENSE_RANK FIRST digunakan pada lajur sal, menghasilkan gelagat yang sama. Oleh itu, klausa KEEP adalah berlebihan dalam senario ini. Walau bagaimanapun, jika lajur berbeza digunakan untuk mengira minimum, seperti nama, klausa KEEP akan menjadi relevan.

Contohnya:

MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno)
Salin selepas log masuk

Pertanyaan ini akan mengembalikan nama yang sepadan dengan gaji terendah untuk setiap jabatan, tidak termasuk sebarang nama pendua yang dikaitkan dengan gaji minimum yang sama.

Atas ialah kandungan terperinci Bagaimanakah Klausa `KEEP` Mempengaruhi `PARTITITION BY` dalam Pertanyaan Agregat Oracle?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan