Di SQL Server, ROW_NUMBER()
fungsi memungkinkan Anda untuk memberi nomor pada output dari kumpulan hasil. Ini mengembalikan nomor urut setiap baris, mulai dari 1.
Jika Anda menentukan partisi untuk kumpulan hasil, setiap partisi menyebabkan penomoran dimulai dari awal lagi (yaitu penomoran akan dimulai dari 1 untuk baris pertama di setiap partisi).
Sintaks
Sintaksnya seperti ini:
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
PARTITION BY value_expression
adalah opsional. Ini membagi set hasil yang dihasilkan oleh FROM
klausa ke dalam partisi tempat fungsi diterapkan. ekspresi_nilai menentukan kolom di mana kumpulan hasil dipartisi. Jika PARTITION BY
klausa tidak ditentukan, semua baris kumpulan hasil kueri diperlakukan sebagai satu grup.
ROW_NUMBER
unik mereka dalam partisi tertentu.
Perhatikan bahwa OVER
klausa biasanya menerima klausa
Contoh 1 – Penggunaan Dasar
Berikut adalah contoh dasar yang menunjukkan cara kerja fungsi ini:
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM Albums;
Hasil:
+-------+------------+--------------------------- +| Baris | Id Album | NamaAlbum ||-------+-----------+---------------------------| | 1 | 1 | budak kekuasaan || 2 | 2 | Daya || 3 | 3 | Bernyanyi di Jalan || 4 | 4 | Ziltoid yang Mahatahu || 5 | 5 | Korban Keren || 6 | 6 | Epicloud || 7 | 7 | Di suatu tempat dalam Waktu || 8 | 8 | Sepotong Pikiran || 9 | 9 | Pembunuh || 10 | 10 | Tidak Ada Doa untuk Kematian || 11 | 11 | Tidak Ada Suara Tanpa Keheningan || 12 | 12 | Wajah Ayunan Besar || 13 | 13 | Malam Biru || 14 | 14 | Keabadian || 15 | 15 | Skandinavia || 16 | 16 | Koper Lama Hilang || 17 | 17 | Puji dan Salahkan || 18 | 18 | Seiring Datanglah Jones || 19 | 19 | Sepanjang Malam Salah || 20 | 20 | Enam Belas Pria Tain || 21 | 21 | Assalamu'alaikum || 22 | 22 | Rusak |+-------+------------+---------------------------+
Dalam hal ini kita dapat melihat bahwa nomor baris sejajar sempurna dengan nilai di AlbumId
kolom. Ini murni kebetulan. Hal ini terjadi karena AlbumId
kolom menggunakan nilai kenaikan mulai dari 1, yang juga merupakan ROW_NUMBER()
menggunakan.
Penomoran baris dikorelasikan dengan AlbumId
kolom sejauh itu dipesan oleh kolom itu. Tapi bukan berarti nilainya harus sama.
Contoh 2 – Tambahkan Klausa WHERE
Menambahkan WHERE
klausa akan menunjukkan apa yang saya maksud.
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsWHERE AlbumId> 15;
Hasil:
+-------+------------+------------------------+ | Baris | Id Album | NamaAlbum ||-------+------------+-----------------|| 1 | 16 | Koper Lama Hilang || 2 | 17 | Puji dan Salahkan || 3 | 18 | Seiring Datanglah Jones || 4 | 19 | Sepanjang Malam Salah || 5 | 20 | Enam Belas Pria Tain || 6 | 21 | Assalamu'alaikum || 7 | 22 | Pecah |+-------+------------+------------------------+Contoh 3 – Mengganti Pengurutan
Mengurutkan dengan urutan menurun alih-alih menaik juga menunjukkan konsep ini.
SELECT ROW_NUMBER() OVER (ORDER BY AlbumId DESC) 'Row', AlbumId, AlbumNameFROM Albums;Hasil:
+-------+------------+--------------------------- +| Baris | Id Album | NamaAlbum ||-------+-----------+---------------------------| | 1 | 22 | Tertangkap || 2 | 21 | Assalamu'alaikum || 3 | 20 | Enam Belas Pria Tain || 4 | 19 | Sepanjang Malam Salah || 5 | 18 | Seiring Datanglah Jones || 6 | 17 | Puji dan Salahkan || 7 | 16 | Koper Lama Hilang || 8 | 15 | Skandinavia || 9 | 14 | Keabadian || 10 | 13 | Malam Biru || 11 | 12 | Wajah Ayunan Besar || 12 | 11 | Tidak Ada Suara Tanpa Keheningan || 13 | 10 | Tidak Ada Doa untuk Kematian || 14 | 9 | Pembunuh || 15 | 8 | Sepotong Pikiran || 16 | 7 | Di suatu tempat dalam Waktu || 17 | 6 | Epicloud || 18 | 5 | Korban Keren || 19 | 4 | Ziltoid yang Mahatahu || 20 | 3 | Bernyanyi di Jalan || 21 | 2 | Daya || 22 | 1 | Powerslave |+-------+------------+--------------------------+Contoh 4 – Pesan dengan Kolom Berbeda
Dan sementara kita melakukannya, mari kita pesan dengan
AlbumName
kolom sebagai gantinya.SELECT ROW_NUMBER() OVER (ORDER BY AlbumName ASC) 'Row', AlbumId, AlbumNameFROM Albums;Hasil:
+-------+------------+--------------------------- +| Baris | Id Album | NamaAlbum ||-------+-----------+---------------------------| | 1 | 19 | Sepanjang Malam Salah || 2 | 18 | Seiring Datanglah Jones || 3 | 12 | Wajah Ayunan Besar || 4 | 13 | Malam Biru || 5 | 22 | Tertangkap || 6 | 5 | Korban Keren || 7 | 6 | Epicloud || 8 | 14 | Keabadian || 9 | 9 | Pembunuh || 10 | 16 | Koper Lama Hilang || 11 | 10 | Tidak Ada Doa untuk Kematian || 12 | 11 | Tidak Ada Suara Tanpa Keheningan || 13 | 8 | Sepotong Pikiran || 14 | 2 | Daya || 15 | 1 | budak kekuasaan || 16 | 17 | Puji dan Salahkan || 17 | 15 | Skandinavia || 18 | 3 | Bernyanyi di Jalan || 19 | 7 | Di suatu tempat dalam Waktu || 20 | 20 | Enam Belas Pria Tain || 21 | 21 | Assalamu'alaikum || 22 | 4 | Ziltoid Yang Maha Tahu |+-------+-----------+------------------------ -+Contoh 5 – Partisi
Seperti disebutkan, Anda juga dapat membagi hasil menjadi beberapa partisi. Saat Anda melakukan ini, penomoran dimulai dari 1 lagi untuk setiap partisi baru.
Contoh:
SELECT Genre, ROW_NUMBER() OVER (PARTITION BY Genre ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsINNER JOIN Genres ON Albums.GenreId =Genres.GenreId;Hasil:
+---------+-------+-----------+---------------- ----------+| Genre | Baris | Id Album | AlbumName ||---------+-------+-----------+----------------- ---------|| Negara | 1 | 3 | Bernyanyi di Jalan || Negara | 2 | 21 | Assalamu'alaikum || Negara | 3 | 22 | Tertangkap || Jazz | 1 | 12 | Wajah Ayunan Besar || Jazz | 2 | 19 | Sepanjang Malam Salah || Jazz | 3 | 20 | Enam Belas Pria Tain || Pop | 1 | 11 | Tidak Ada Suara Tanpa Keheningan || Pop | 2 | 13 | Malam Biru || Pop | 3 | 14 | Keabadian || Pop | 4 | 15 | Skandinavia || Pop | 5 | 16 | Koper Lama Hilang || Pop | 6 | 17 | Puji dan Salahkan || Pop | 7 | 18 | Seiring Datanglah Jones || Batu | 1 | 1 | budak kekuasaan || Batu | 2 | 2 | Daya || Batu | 3 | 4 | Ziltoid yang Mahatahu || Batu | 4 | 5 | Korban Keren || Batu | 5 | 6 | Epicloud || Batu | 6 | 7 | Di suatu tempat dalam Waktu || Batu | 7 | 8 | Sepotong Pikiran || Batu | 8 | 9 | Pembunuh || Batu | 9 | 10 | Tidak Ada Doa untuk Kematian |+---------+-------+-----------+------------- -------------+Sekali lagi kita dapat melihat bahwa
ROW_NUMBER
danAlbumId
kolom sama sekali tidak berkorelasi.Dalam hal ini saya mempartisi dengan
Genre
kolom. Ini menyebabkan penomoran mulai dari 1 lagi untuk setiap genre.