Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana ROW_NUMBER() Bekerja di SQL Server

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.

Dibutuhkan. Ini menentukan urutan di mana baris diberi ROW_NUMBER unik mereka dalam partisi tertentu.

Perhatikan bahwa OVER klausa biasanya menerima klausa , tetapi argumen itu tidak dapat digunakan dengan fungsi ini.

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 dan AlbumId kolom sama sekali tidak berkorelasi.

Dalam hal ini saya mempartisi dengan Genre kolom. Ini menyebabkan penomoran mulai dari 1 lagi untuk setiap genre.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ganti spasi duplikat dengan satu spasi di T-SQL

  2. Ukuran maksimum untuk Kueri SQL Server? klausa IN? Apakah ada Pendekatan yang Lebih Baik?

  3. SYSUTCDATETIME() Contoh di SQL Server (T-SQL)

  4. SQLException :String atau data biner akan terpotong

  5. Bagaimana cara menghapus 1000 baris teratas dari tabel menggunakan Sql Server 2008?