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

Fungsi Peringkat di SQL Server

Misalkan Anda sedang merancang aplikasi database SQL Server untuk CEO perusahaan dan Anda harus menampilkan karyawan kelima yang dibayar paling tinggi di perusahaan.

Apa yang akan kamu lakukan? Salah satu solusinya adalah dengan menulis kueri seperti ini:

SELECT EmployeeName
FROM Employees
ORDER BY Salary DESC
OFFSET 4 ROWS
FETCH FIRST 1 ROWS ONLY;

Kueri di atas terlihat rumit, terutama jika Anda harus memeringkat semua karyawan. Dalam hal ini, salah satu solusinya adalah membuat daftar karyawan berdasarkan urutan gaji dan kemudian mengambil indeks karyawan sebagai peringkat. Namun, hal-hal menjadi rumit jika beberapa karyawan memiliki gaji yang sama. Bagaimana Anda memberi peringkat kepada mereka?

Untungnya, SQL Server dilengkapi dengan fungsi peringkat bawaan yang dapat digunakan untuk memberi peringkat catatan dalam berbagai cara. Pada artikel ini, kami akan memperkenalkan fungsi peringkat server SQL secara rinci yang mengilustrasikannya dengan contoh.

Ada empat jenis fungsi peringkat di SQL Server:

  • Peringkat()
  • Peringkat_Padat()
  • Nomor Baris()
  • Ntile()

Penting untuk disebutkan bahwa semua fungsi peringkat di SQL server memerlukan klausa ORDER BY.

Sebelum kita melihat masing-masing fungsi peringkat secara rinci, pertama-tama, mari kita buat data dummy yang akan kita gunakan dalam artikel ini untuk menjelaskan fungsi peringkat. Jalankan script berikut:

CREATE DATABASE Showroom

Use Showroom
CREATE TABLE Car
(
CarId int identity(1,1) primary key,
Name varchar(100),
Make varchar(100),
Model int ,
Price int ,
Type varchar(20)
)

insert into Car( Name, Make, Model , Price, Type)
VALUES ('Corrolla','Toyota',2015, 20000,'Sedan'),
('Civic','Honda',2018, 25000,'Sedan'),
('Passo','Toyota',2012, 18000,'Hatchback'),
('Land Cruiser','Toyota',2017, 40000,'SUV'),
('Corrolla','Toyota',2011, 17000,'Sedan'),
('Vitz','Toyota',2014, 15000,'Hatchback'),
('Accord','Honda',2018, 28000,'Sedan'),
('7500','BMW',2015, 50000,'Sedan'),
('Parado','Toyota',2011, 25000,'SUV'),
('C200','Mercedez',2010, 26000,'Sedan'),
('Corrolla','Toyota',2014, 19000,'Sedan'),
('Civic','Honda',2015, 20000,'Sedan')

Pada script diatas kita membuat database Showroom dengan satu meja Mobil. Tabel Mobil memiliki lima atribut:CarId, Name, Make, Model, Price dan Type.

Selanjutnya, kami menambahkan 12 catatan dummy di tabel Mobil.

Sekarang, Anda melihat masing-masing fungsi peringkat.

1. Fungsi Peringkat

Fungsi peringkat di SQL server memberikan peringkat ke setiap record yang diurutkan oleh klausa ORDER BY. Misalnya, jika Anda ingin melihat mobil termahal kelima di tabel Mobil, Anda dapat menggunakan fungsi peringkat sebagai berikut:

Use Showroom
SELECT Name,Make,Model, Price, Type,
RANK() OVER(ORDER BY Price DESC) as PriceRank
FROM Car

Pada script di atas, pilih Name, Make, Model, Price, Type dan rank setiap mobil yang dipesan berdasarkan Price sebagai kolom “PriceRank”. Sintaks untuk fungsi Rank sederhana. Anda harus menulis fungsi RANK diikuti oleh operator OVER. Di dalam operator OVER, Anda harus meneruskan klausa ORDER BY yang mengurutkan data. Output dari script di atas terlihat seperti ini:

Anda dapat melihat peringkat untuk setiap mobil. Penting untuk disebutkan bahwa jika ada seri antara peringkat dua rekor, posisi peringkat berikutnya dilewati. Misalnya, ada dasi antara catatan 5 dan 6 di output. Baik Parado dan Civic memiliki harga yang sama, dan karenanya telah menempati peringkat 5. Namun, peringkat berikutnya, khususnya, peringkat 6 dilewati dan dua mobil berikutnya dalam daftar telah menempati peringkat 7 karena mereka juga memiliki harga yang sama. Setelah peringkat 7, peringkat 8 dilewati lagi dan peringkat berikutnya yang ditetapkan adalah 9.

Anda dapat membagi data menjadi beberapa partisi dan kemudian menerapkan peringkat ke masing-masing partisi. Dalam skrip berikut, ada partisi catatan menurut jenisnya. Kami memberi peringkat mobil di dalam setiap partisi.

SELECT Name,Make,Model, Price, Type,
RANK() OVER(PARTITION BY Type ORDER BY Price DESC) as PriceRank
FROM Car

Output dari script di atas terlihat seperti ini:

Terbukti dari output bahwa catatan telah dipartisi menurut jenis mobil dan peringkat telah ditetapkan secara lokal di dalam partisi. Misalnya, dua record pertama adalah milik partisi “Hatchback” dan diberi peringkat 1 dan 2. Untuk partisi berikutnya, yaitu “Sedan”, peringkatnya direset menjadi 1.

2. Fungsi Dense_Rank

Fungsi density_rank mirip dengan fungsi rank. Namun, dalam kasus peringkat_padat, jika ada seri antara dua catatan dalam hal peringkat, peringkat berikutnya tidak dilewati. Mari kita lihat mendemonstrasikannya dengan contoh. Jalankan script berikut:

Use Showroom
SELECT Name,Make,Model, Price, Type,
DENSE_RANK() OVER(ORDER BY Price DESC) as DensePriceRank
FROM Car

Sekali lagi Anda dapat melihat bahwa catatan ke-5 dan ke-6 memiliki nilai yang sama untuk Harga dan keduanya telah ditetapkan peringkat 5. Namun, tidak seperti fungsi peringkat yang melewatkan peringkat berikutnya, fungsi peringkat_padat tidak melewatkan peringkat berikutnya, dan peringkat 6 telah ditetapkan ke catatan berikutnya.

Seperti fungsi peringkat, fungsi peringkat_padat juga dapat diterapkan ke partisi dengan klausa. Perhatikan script berikut:

SELECT Name,Make,Model, Price, Type,
DENSE_RANK() OVER(PARTITION BY Type ORDER BY Price DESC) as DensePriceRank
FROM Car

Output dari script di atas terlihat seperti ini:

3. Fungsi Baris_Nomor

Fungsi row_number juga memberi peringkat pada record menurut kondisi yang ditentukan oleh klausa ORDER BY. Namun, tidak seperti fungsi peringkat dan peringkat_padat, fungsi nomor_baris tidak menetapkan peringkat yang sama di mana ada nilai duplikat untuk kolom yang ditentukan oleh klausa ORDER BY. Perhatikan script berikut:

SELECT Name,Make,Model, Price, Type,
DENSE_RANK() OVER(PARTITION BY Type ORDER BY Price DESC) as DensePriceRank
FROM Car

Output dari script di atas terlihat seperti ini:

Dari skrip di atas, Anda dapat melihat bahwa catatan ke-5 dan ke-6 memiliki nilai yang sama untuk kolom Harga, tetapi peringkat yang ditetapkan untuknya berbeda.

Demikian pula, fungsi row_number dapat diterapkan ke data yang dipartisi. Lihat skrip berikut misalnya.

SELECT Name,Make,Model, Price, Type,
ROW_NUMBER() OVER(PARTITION BY Type ORDER BY Price DESC) AS PriceRankRow
FROM Car

Output dari script di atas terlihat seperti ini:

4. Fungsi NTILE

Fungsi NTILE mengelompokkan peringkat. Misalkan Anda memiliki 12 record dalam sebuah tabel, dan Anda ingin mengurutkannya ke dalam kelompok 4. Tiga record pertama akan memiliki peringkat 1, tiga record berikutnya akan memiliki peringkat 2 dan seterusnya.

Mari kita lihat contoh fungsi NTILE.

Use Showroom
SELECT Name,Make,Model, Price, Type,
NTILE(4) OVER(ORDER BY Price DESC) as NtilePrice
FROM Car

Dalam skrip di atas, kami meneruskan 4 sebagai parameter ke fungsi NTILE. Karena kami memiliki 12 catatan, Anda akan melihat total 4 peringkat berbeda di mana 1 peringkat akan ditetapkan untuk tiga catatan. Outputnya terlihat seperti ini:

Anda dapat melihat bahwa tiga mobil termahal pertama berada di peringkat 1, tiga berikutnya berada di peringkat 2, dan seterusnya.

Fungsi NTILE juga dapat diterapkan ke data yang dipartisi. Perhatikan script berikut:

SELECT Name,Make,Model, Price, Type,
NTILE(4) OVER(PARTITION BY Type ORDER BY Price DESC) as NtilePrice
FROM Car

Kesimpulan

Fungsi peringkat di SQL Server digunakan untuk memberi peringkat data dengan cara yang berbeda. Dalam bacaan ini, kami memperkenalkan berbagai jenis fungsi peringkat dengan contohnya. Fungsi rank dan density_rank memberikan peringkat yang sama pada data dengan nilai yang sama dalam klausa ORDER BY sedangkan fungsi row_number memberi peringkat pada record dengan cara inkremental bahkan jika ada seri.
Jika tidak ada record duplikat di kolom yang ditentukan oleh klausa ORDER BY, fungsi rank, density_rank dan row_number berperilaku dengan cara yang sama.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DevOps:DBA atau Pengembang – Mendapatkan Keseimbangan dengan Benar

  2. Menghindari kebuntuan SQL dengan penyetelan kueri:Saran dari Brent Ozar

  3. SQL Server Bergabung dengan Estimasi menggunakan Histogram Coarse Alignment

  4. Menghubungkan ke SQL Server 2012 menggunakan sqlalchemy dan pyodbc

  5. Bagaimana Anda membuat bidang boolean ya/tidak di SQL server?