Di SQL Server, NTILE()
fungsi memungkinkan Anda untuk mendistribusikan baris dalam partisi yang dipesan ke dalam jumlah grup yang ditentukan. Grup diberi nomor, mulai dari 1. Untuk setiap baris, NTILE()
mengembalikan nomor grup tempat baris tersebut berada.
Anda cukup memberikan jumlah grup yang Anda inginkan saat memanggil fungsi.
Sintaks
Sintaksnya seperti ini:
NTILE (integer_expression) OVER ( [] )
ekspresi_integer adalah ekspresi bilangan bulat positif yang menentukan jumlah grup di mana setiap partisi harus dibagi. Itu bisa bertipe int , atau besar .
FROM
klausa ke dalam partisi tempat fungsi diterapkan.
NTILE()
nilai ditugaskan ke baris dalam partisi. Sebuah bilangan bulat tidak dapat mewakili kolom ketika
Contoh 1 – Penggunaan Dasar
Berikut adalah contoh dasar yang menunjukkan cara kerja fungsi ini:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE'FROM Scoreboard;
Hasil:
+----------+---------+---------+| Pemain | Skor | NTILE ||----------+---------+---------|| Bart | 2010 | 1 || Terbakar | 1270 | 1 || Meg | 1030 | 2 || Marge | 990 | 2 || Lisa | 710 | 3 || Ned | 666 | 3 || apu | 350 | 4 || Homer | 1 | 4 |+----------+---------+---------+
Dalam hal ini ada 8 hasil dan nilai yang saya berikan ke NTILE()
adalah 4, sehingga nilainya tersebar merata di 4 kelompok.
Contoh 2 – Ubah Nilai NTILE
Inilah yang terjadi jika saya mengubah NTILE()
nilai ke 3.
PILIH Pemain, Skor, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE'FROM Scoreboard;
Hasil:
+----------+---------+---------+| Pemain | Skor | NTILE ||----------+---------+---------|| Bart | 2010 | 1 || Terbakar | 1270 | 1 || Meg | 1030 | 1 || Marge | 990 | 2 || Lisa | 710 | 2 || Ned | 666 | 2 || apu | 350 | 3 || Homer | 1 | 3 |+----------+---------+---------+
Hasilnya didistribusikan ke 3 kelompok. Seperti yang Anda duga, grup terakhir berakhir dengan hanya 2 baris (dibandingkan dengan 3 untuk grup lain).
Contoh 3 – Mengganti Pengurutan
Mengalihkan urutan antara naik dan turun biasanya akan menghasilkan NTILE()
nilai yang diterapkan ke baris yang berbeda.
PILIH Pemain, Skor, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC;
Hasil:
+----------+--------+---------+----- ---------------+| Pemain | Skor | NTILE Turun | NTILE Ascending ||----------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 4 || Terbakar | 1270 | 1 | 4 || Meg | 1030 | 2 | 3 || Marge | 990 | 2 | 3 || Lisa | 710 | 3 | 2 || Ned | 666 | 3 | 2 || apu | 350 | 4 | 1 || Homer | 1 | 4 | 1 |+----------+--------+--------------------+----- --------------+
Namun, ini akan tergantung pada berapa banyak baris dalam kumpulan hasil vs jumlah NTILE. Jelas, jika NTILE()
nilainya 1, maka tidak akan ada perbedaan.
SELECT Player, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC;
Hasil:
+----------+--------+---------+----- ---------------+| Pemain | Skor | NTILE Turun | NTILE Ascending ||----------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 || Terbakar | 1270 | 1 | 1 || Meg | 1030 | 1 | 1 || Marge | 990 | 1 | 1 || Lisa | 710 | 1 | 1 || Ned | 666 | 1 | 1 || apu | 350 | 1 | 1 || Homer | 1 | 1 | 1 |+----------+--------+--------------------+----- --------------+
Hal yang sama akan terjadi jika kumpulan hasil hanya berisi satu baris, terlepas dari NTILE()
nilai:
PILIH Pemain, Skor, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardWHERE Score> 2000ORDER BY Score DESC;Hasil:
+----------+--------+---------+----- ---------------+| Pemain | Skor | NTILE Turun | NTILE Ascending ||----------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 |+----------+--------+--------------------+----- --------------+Contoh 4 – Partisi
Anda dapat menggunakan
PARTITION BY
klausa untuk membagi hasil menjadi partisi. Saat Anda melakukan ini,NTILE()
diterapkan pada setiap partisi.Contoh:
PILIH TeamName, Pemain, Skor, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE'FROM Scoreboard sINNER JOIN Team tON t.TeamId =s.TeamId;Hasil:
+------------+----------+---------+------------ -------+| Nama Tim | Pemain | Skor | NTILE ||------------+----------+---------+------------- ------|| Anjing laut | apu | 350 | 1 || Anjing laut | Ned | 666 | 1 || Anjing laut | Meg | 1030 | 2 || Anjing laut | Terbakar | 1270 | 2 || Simpsons | Homer | 1 | 1 || Simpsons | Lisa | 710 | 1 || Simpsons | Marge | 990 | 2 || Simpsons | Bart | 2010 | 2 |+------------+----------+---------+------------- ------+