PARTITION BY dengan dan tanpa KEEP dalam Oracle
Pengenalan
Dalam Oracle, PARTITION Klausa BY digunakan untuk membahagikan set data kepada subset untuk melaksanakan agregat pengiraan. Klausa KEEP menentukan baris mana yang perlu disimpan daripada setiap partition. Artikel ini membincangkan perbezaan antara menggunakan PARTITION BY dengan dan tanpa KEEP.
Pertanyaan dengan dan tanpa KEEP
Pertimbangkan dua pertanyaan berikut:
SELECT empno, deptno, sal, MIN(sal) OVER (PARTITION BY deptno) AS "Lowest", MAX(sal) OVER (PARTITION BY deptno) AS "Highest" FROM empl; SELECT empno, deptno, sal, 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;
Pertanyaan pertama menggunakan PARTITION BY tanpa KEEP, manakala pertanyaan kedua menggunakan KEEP (DENSE_RANK). Kedua-dua pertanyaan mengira gaji terendah dan tertinggi untuk setiap jabatan.
KEEP (DENSE_RANK FIRST ORDER BY sal)
Dalam pertanyaan kedua, KEEP (DENSE_RANK FIRST ORDER BY sal) klausa mengarahkan Oracle untuk menyimpan hanya baris pertama untuk setiap jabatan selepas menyusun baris mengikut gaji mengikut tertib menaik. Fungsi DENSE_RANK memberikan pangkat kepada setiap baris dalam setiap partition, dan pangkat pertama menunjukkan gaji terendah.
Perbezaan antara Pertanyaan
Pertanyaan kedua adalah berlebihan kerana MIN dan DENSE_RANK FIRST kedua-duanya beroperasi pada lajur sal yang sama. Mereka akan menghasilkan hasil yang sama seperti pertanyaan pertama, yang mengira gaji terendah secara langsung tanpa menggunakan KEEP.
Ini kerana klausa KEEP (DENSE_RANK FIRST ORDER BY sal) hanya berguna apabila pengagregatan MIN atau MAX adalah dilakukan pada lajur yang berbeza daripada lajur pesanan. Dalam kes sedemikian, klausa KEEP membenarkan kawalan yang lebih khusus ke atas baris mana yang disertakan dalam pengiraan.
Contoh
Pertimbangkan pertanyaan berikut:
SELECT name, sal, deptno, MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest", MIN(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS "Lowest Employee" FROM test;
Pertanyaan ini mengira gaji terendah untuk setiap jabatan, bersama-sama dengan nama pekerja dengan gaji terendah. Klausa KEEP (DENSE_RANK FIRST ORDER BY sal) adalah perlu dalam kes ini kerana ia memastikan bahawa hanya gaji terendah dan nama pekerja yang sepadan dikembalikan, walaupun terdapat beberapa baris dengan gaji terendah yang sama.
Atas ialah kandungan terperinci Bagaimanakah Klausa `PARTITION BY` Oracle Berbeza dengan dan tanpa `KEEP`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!