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
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
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:
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)
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!