Dapatkah seseorang tolong jelaskan apa yang dilakukan partition by
kata kunci dan berikan contoh sederhana dalam tindakan, serta mengapa orang ingin menggunakannya? Saya memiliki query SQL yang ditulis oleh orang lain dan saya mencoba mencari tahu apa fungsinya.
Contoh partisi dengan:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Contoh yang saya lihat online tampak agak terlalu mendalam.
sql
oracle
window-functions
Alex Beardsley
sumber
sumber
Jawaban:
The
PARTITION BY
klausul menetapkan berbagai catatan yang akan digunakan untuk setiap "GROUP" dalamOVER
klausa.Dalam contoh Anda SQL,
DEPT_COUNT
akan mengembalikan jumlah karyawan dalam departemen itu untuk setiap catatan karyawan. (Seolah-olah Anda men-nomalisasiemp
tabel; Anda masih mengembalikan setiap record diemp
tabel.)Jika ada kolom lain (misalnya,
state
) maka Anda dapat menghitung berapa banyak departemen di Negara tersebut.Hal ini seperti mendapatkan hasil
GROUP BY
(SUM
,AVG
, dll) tanpa menggabungkan hasil set (yaitu menghapus catatan yang cocok).Ini berguna ketika Anda menggunakan fungsi
LAST OVER
atauMIN OVER
untuk mendapatkan, misalnya, gaji terendah dan tertinggi di departemen dan kemudian menggunakannya dalam perhitungan terhadap catatan ini gaji tanpa sub pilih, yang jauh lebih cepat.Baca artikel AskTom yang tertaut untuk perincian lebih lanjut.
sumber
last over
danmin over
. Saya akan membayangkan sub pilih akan lebih lambat, tetapi tata bahasa Inggris dalam jawabannya tidak menyarankan itu.Konsep ini dijelaskan dengan sangat baik oleh jawaban yang diterima, tetapi saya menemukan bahwa semakin banyak contoh yang dilihat, semakin baik tenggelam. Berikut adalah contoh tambahan:
1) Boss berkata "dapatkan saya jumlah barang yang ada dalam stok yang dikelompokkan berdasarkan merek"
Anda mengatakan : "tidak masalah"
Hasil:
2) Bos berkata "Sekarang ambilkan saya daftar semua barang, dengan merek mereka DAN jumlah barang yang dimiliki masing-masing merek"
Anda dapat mencoba:
Tapi Anda mendapatkan:
Di sinilah
OVER (PARTITION BY BRAND)
masuk:Yang artinya:
COUNT(ITEM_ID)
- dapatkan jumlah itemOVER
- Lebih dari set baris(PARTITION BY BRAND)
- yang memiliki merek yang samaDan hasilnya adalah:
dll ...
sumber
Ini adalah ekstensi SQL yang disebut analytics. "Lebih" dalam pernyataan pilih memberi tahu oracle bahwa fungsi tersebut adalah fungsi analitis, bukan fungsi kelompok. Keuntungan menggunakan analitik adalah Anda dapat mengumpulkan jumlah, jumlah, dan banyak lagi hanya dengan satu kali melewati data alih-alih mengulang-ulang data dengan sub seleksi atau lebih buruk, PL / SQL.
Itu memang terlihat membingungkan pada awalnya tetapi ini akan menjadi sifat kedua dengan cepat. Tidak ada yang menjelaskan lebih baik daripada Tom Kyte. Jadi tautan di atas sangat bagus.
Tentu saja, membaca dokumentasi adalah suatu keharusan.
sumber
Di sini kita mendapatkan hitungan untuk masing-masing deptno. Adapun deptno 10 kami memiliki 4 catatan dalam tabel emp hasil yang sama untuk deptno 20 dan 30 juga.
sumber
kata kunci over partisi adalah seolah-olah kita mempartisi data dengan client_id membuat subset dari setiap id klien
kueri ini akan mengembalikan jumlah operasi yang dilakukan oleh client_id
sumber
Saya pikir, contoh ini menunjukkan nuansa kecil tentang cara kerja partisi dan cara kerja kelompok. Contoh saya adalah dari Oracle 12, jika contoh saya adalah bug kompilasi.
Saya mencoba :
Namun ini berfungsi seperti yang diharapkan:
Memproduksi jumlah elemen di setiap negara berdasarkan kunci eksternal "data_key". Jadi, jika, data_key = 'APPLE' memiliki 3 baris dengan status 'A', 2 baris dengan status 'B', satu baris dengan status 'C', baris yang sesuai untuk 'APPLE' adalah 'APPLE', 3, 2 , 1, 6.
sumber