Rumah > pangkalan data > tutorial mysql > Bagaimanakah Klausa `PARTITION BY` Oracle Berbeza dengan dan tanpa `KEEP`?

Bagaimanakah Klausa `PARTITION BY` Oracle Berbeza dengan dan tanpa `KEEP`?

Susan Sarandon
Lepaskan: 2024-12-21 00:45:10
asal
661 orang telah melayarinya

How Does Oracle's `PARTITION BY` Clause Differ with and without `KEEP`?

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

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

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!

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