Saya telah menggunakan GROUP BY
untuk semua jenis kueri agregat selama bertahun-tahun. Baru-baru ini, saya telah melakukan rekayasa balik terhadap beberapa kode yang digunakan PARTITION BY
untuk melakukan agregasi. Dalam membaca semua dokumentasi yang bisa saya temukan PARTITION BY
, kedengarannya seperti GROUP BY
, mungkin dengan sedikit fungsionalitas tambahan? Apakah mereka dua versi dari fungsi umum yang sama, atau mereka sesuatu yang sama sekali berbeda?
sumber
Kita dapat mengambil contoh sederhana.
Pertimbangkan sebuah tabel bernama
TableA
dengan nilai berikut:GROUP BY
Sintaksis:
Kita dapat mendaftar
GROUP BY
di tabel kami:Hasil:
Dalam tabel asli kami, kami memiliki 7 baris dan ketika kami menerapkan
GROUP BY id
, server mengelompokkan hasil berdasarkanid
:Dengan kata sederhana:
PARTITION BY
Sebelum pergi ke PARTITION OLEH, mari kita lihat
OVER
klausa:Menurut definisi MSDN:
PARTITION BY tidak akan mengurangi jumlah baris yang dikembalikan.
Kita dapat menerapkan PARTITION BY dalam contoh tabel kita:
Hasil:
Lihatlah hasilnya - ini akan mempartisi baris dan mengembalikan semua baris, tidak seperti GROUP BY.
sumber
partition by
dapat mempengaruhi jumlah baris, hanya saja tidak akan mengurangi jumlah baris.SELECT
dalamSELECT DISTINCT
ke permintaan kedua? bukankah itu mengembalikan set data yang sama denganGROUP BY
kueri? Apa alasan memilih satu atau yang lain?partition by
sebenarnya tidak menggulung data. Ini memungkinkan Anda untuk mereset sesuatu berdasarkan per grup. Misalnya, Anda bisa mendapatkan kolom ordinal dalam grup dengan mempartisi pada bidang pengelompokan dan menggunakanrownum()
lebih dari baris dalam grup itu. Ini memberi Anda sesuatu yang berperilaku sedikit seperti kolom identitas yang diatur ulang di awal setiap grup.sumber
Ditemukan di tautan ini: OVER Clause
sumber
Ini memberikan data yang digulung tanpa menggulung
misalkan saya ingin mengembalikan posisi relatif wilayah penjualan
Menggunakan PARTISI OLEH, saya bisa mengembalikan jumlah penjualan untuk wilayah tertentu dan jumlah MAX di semua wilayah penjualan di baris yang sama.
Ini berarti Anda akan memiliki data berulang, tetapi mungkin sesuai dengan konsumen akhir dalam arti bahwa data telah dikumpulkan tetapi tidak ada data yang hilang - seperti halnya dengan GROUP BY.
sumber
PARTITION BY
analitik, sementaraGROUP BY
agregat. Untuk menggunakanPARTITION BY
, Anda harus mengisinya dengan klausa OVER .sumber
PARTITION BY is analytic
pernyataan sederhana ini sangat membantu saya. +1.Pada pemahaman saya, Partition By hampir identik dengan Group By, tetapi dengan perbedaan berikut:
Grup itu dengan benar-benar mengelompokkan hasil yang diatur mengembalikan satu baris per grup, yang karenanya menghasilkan SQL Server hanya memungkinkan dalam fungsi agregat daftar SELECT atau kolom yang merupakan bagian dari grup dengan klausa (dalam hal ini SQL Server dapat menjamin bahwa ada yang unik hasil untuk setiap kelompok).
Sebagai contoh, perhatikan MySQL yang memungkinkan untuk ada di kolom daftar SELECT yang tidak didefinisikan dalam klausa Kelompok Menurut, dalam hal ini satu baris masih dikembalikan per grup, namun jika kolom tidak memiliki hasil yang unik maka tidak ada jaminan apa yang akan menjadi output!
Tetapi dengan Partition By, meskipun hasil fungsi identik dengan hasil fungsi agregat dengan Group By, Anda tetap mendapatkan hasil normal, yang berarti bahwa seseorang mendapatkan satu baris per baris yang mendasarinya, dan bukan satu baris per grup, dan karena yang ini dapat memiliki kolom yang tidak unik per grup dalam daftar SELECT.
Jadi sebagai ringkasan, Group By akan menjadi yang terbaik ketika membutuhkan output dari satu baris per grup, dan Partition By akan menjadi yang terbaik ketika seseorang membutuhkan semua baris tetapi masih menginginkan fungsi agregat berdasarkan pada grup.
Tentu saja mungkin juga ada masalah kinerja, lihat http://social.msdn.microsoft.com/Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba .
sumber
Saat Anda menggunakan
GROUP BY
, baris yang dihasilkan biasanya kurang dari baris yang masuk.Tetapi, ketika Anda menggunakan
PARTITION BY
, jumlah baris yang dihasilkan harus sama dengan yang masuk.sumber
Misalkan kita memiliki 14 catatan
name
kolom dalam tabeldi
group by
itu akan memberikan hitungan dalam satu baris yaitu 14
tapi di
partition by
itu akan 14 baris peningkatan hitungan
sumber
Pengamatan kecil. Mekanisme otomasi untuk secara dinamis menghasilkan SQL menggunakan 'partisi dengan' itu jauh lebih mudah untuk diterapkan dalam kaitannya dengan 'grup oleh'. Dalam hal 'dikelompokkan berdasarkan', Kami harus menjaga konten kolom 'pilih'.
Maaf untuk Bahasa Inggris Saya.
sumber
Ini memiliki skenario penggunaan yang sangat berbeda. Saat Anda menggunakan GROUP BY, Anda menggabungkan beberapa catatan untuk kolom yang sama dan Anda memiliki kumpulan kumpulan hasil.
Namun ketika Anda menggunakan PARTISI DENGAN set hasil Anda sama tetapi Anda hanya memiliki agregasi atas fungsi jendela dan Anda tidak menggabungkan catatan, Anda masih akan memiliki jumlah catatan yang sama.
Berikut ini adalah artikel bermanfaat yang menjelaskan perbedaannya: http://alevryustemov.com/sql/sql-partition-by/
sumber
sumber