Masalah:
Anda ingin memberi setiap baris dalam tabel hasil nomor terpisah.
Contoh:
Basis data kami memiliki tabel bernama furniture
dengan data pada kolom berikut:code
(kunci utama) dan name
.
kode | nama |
---|---|
101 | tempat tidur |
202 | sofa |
333 | kursi |
123 | rak buku |
235 | tabel |
766 | meja |
furniture
table menyimpan nama furniture yang ingin kita beri nomor.
Solusi:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
Kueri mengembalikan nomor baris setiap perabot beserta nama dan kodenya:
num_row | nama | kode |
---|---|---|
1 | tempat tidur | 101 |
2 | sofa | 202 |
3 | kursi | 333 |
4 | rak buku | 123 |
5 | tabel | 235 |
6 | meja | 766 |
Perhatikan bahwa nama furnitur tidak diurutkan.
Diskusi:
Jika Anda ingin memberi nomor pada setiap baris dalam kumpulan hasil, SQL menyediakan ROW_NUMBER()
fungsi. Fungsi ini digunakan dalam SELECT
klausa dengan kolom lainnya. Setelah ROW_NUMBER()
klausa, kita sebut OVER()
fungsi. Jika Anda memberikan argumen apa pun ke OVER
, penomoran baris tidak akan diurutkan menurut kolom mana pun. Dengan demikian, urutan baris yang ditampilkan akan menjadi non-deterministik; dalam kebanyakan kasus, ini adalah urutan di mana catatan dimasukkan ke dalam tabel. Penomoran baris dimulai dari 1. Dalam contoh kita, setiap record memiliki nomor dari 1 hingga 6.
Kami juga dapat menetapkan nomor baris menggunakan kolom. Pada contoh di bawah ini, kami memberi nomor pada record yang diurutkan berdasarkan nama. Kami melakukan ini dengan meneruskan argumen itu ke OVER
bersama dengan ORDER BY
(ini mengurutkan catatan menurut kolom nama):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Saat Anda melihat kumpulan hasil, Anda melihat baris yang diurutkan dengan nomornya:
baris | nama | kode |
---|---|---|
1 | tempat tidur | 101 |
2 | rak buku | 123 |
3 | kursi | 333 |
4 | meja | 766 |
5 | sofa | 202 |
6 | tabel | 235 |
Penomoran diberikan oleh ROW_NUMBER()
tidak tergantung pada urutan baris dalam tabel hasil. Pada contoh di bawah, kami memberi nomor pada record menggunakan nama kolom yang diurutkan (OVER(ORDER BY name)
), tetapi kami menampilkan catatan dalam kumpulan hasil menurut kolom lain (dalam contoh kami, ORDER BY code
).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
Kueri mengembalikan nomor setiap baris, tetapi nomor ini tidak dalam urutan menaik, karena catatan diurutkan menurut kode kolom:
baris | nama | kode |
---|---|---|
1 | tempat tidur | 101 |
2 | rak buku | 123 |
5 | sofa | 202 |
6 | tabel | 235 |
3 | kursi | 333 |
4 | meja | 766 |
Urutan default dari baris yang diurutkan adalah menaik, tetapi Anda juga dapat mengurutkan dalam urutan menurun menggunakan DESC
kata kunci setelah nama kolom yang ingin Anda urutkan:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
Kueri di atas mengembalikan kumpulan hasil:
baris | nama | kode |
---|---|---|
4 | meja | 766 |
3 | kursi | 333 |
6 | tabel | 235 |
5 | sofa | 202 |
2 | rak buku | 123 |
1 | tempat tidur | 101 |