Anda hanya akan melihat perbedaannya jika Anda memiliki ikatan di dalam partisi untuk nilai pemesanan tertentu.
RANK
dan DENSE_RANK
bersifat deterministik dalam hal ini, semua baris dengan nilai yang sama untuk kolom urutan dan partisi akan berakhir dengan hasil yang sama, sedangkan ROW_NUMBER
akan secara sewenang-wenang (non deterministik) memberikan hasil yang meningkat ke baris terikat.
Contoh: (Semua baris memiliki yang sama StyleID
sehingga berada di partisi yang sama dan di dalam partisi itu 3 baris pertama diikat ketika dipesan oleh ID
)
WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,2)
SELECT *,
RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'RANK',
ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM T
Kembali
StyleID ID RANK ROW_NUMBER DENSE_RANK
----------- -------- --------- --------------- ----------
1 1 1 1 1
1 1 1 2 1
1 1 1 3 1
1 2 4 4 2
Anda dapat melihat bahwa untuk tiga baris identik ROW_NUMBER
kenaikan, RANK
nilainya tetap sama dengan lompatannya 4
. DENSE_RANK
juga memberikan peringkat yang sama untuk ketiga baris tetapi kemudian nilai berbeda selanjutnya diberi nilai 2.
Artikel ini membahas hubungan yang menarik antara
ROW_NUMBER()
danDENSE_RANK()
(RANK()
fungsi tidak diperlakukan secara khusus). Saat Anda membutuhkan yang dihasilkanROW_NUMBER()
padaSELECT DISTINCT
pernyataan,ROW_NUMBER()
akan menghasilkan nilai yang berbeda sebelum dihilangkan olehDISTINCT
kata kunci. Misalnya kueri ini... mungkin menghasilkan hasil ini (
DISTINCT
tidak berpengaruh):Sedangkan kueri ini:
... menghasilkan apa yang mungkin Anda inginkan dalam hal ini:
Perhatikan bahwa
ORDER BY
klausaDENSE_RANK()
fungsi akan membutuhkan semua kolom lain dariSELECT DISTINCT
klausa untuk berfungsi dengan baik.Alasan untuk ini adalah bahwa secara logis, fungsi jendela dihitung sebelum
DISTINCT
diterapkan .Ketiga fungsi tersebut dibandingkan
Menggunakan sintaks standar PostgreSQL / Sybase / SQL (
WINDOW
klausa):... Anda akan mendapatkan:
sumber
Sedikit:
Pangkat baris adalah satu ditambah jumlah pangkat yang datang sebelum baris yang dipertanyakan.
Row_number adalah peringkat baris yang berbeda, tanpa ada perbedaan dalam peringkat.
http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile
sumber
Permintaan sederhana tanpa klausa partisi:
Keluaran:
sumber
Lihat contoh ini.
Masukkan beberapa data
Ulangi Nilai yang sama untuk 1
Lihat Semua
Lihatlah hasil Anda
Perlu memahami perbedaannya
sumber
Juga, perhatikan ORDER OLEH di PARTITION (Standard AdventureWorks db digunakan misalnya) saat menggunakan RANK.
Memberikan hasil:
SalesOrderID SalesOrderDetailID rank_same_as_partition rank_salesorderdetailid43.659 1 1 1
43.659 2 1 2
43.659 3 1 3
43.659 4 1 4
43.659 5 1 5
43.659 6 1 6
43.659 7 1 7
43.659 8 1 8
43.659 9 1 9
43.659 10 1 10
43.659 11 1 11
43.659 12 1 12
Tetapi jika ubah pesanan menjadi (gunakan OrderQty:
Memberi:
SalesOrderID OrderQty rank_salesorderid rank_orderqty43.659 1 1 1
43.659 1 1 1
43.659 1 1 1
43.659 1 1 1
43.659 1 1 1
43.659 1 1 1
43.659 2 1 7
43.659 2 1 7
43.659 3 1 9
43.659 3 1 9
43.659 4 1 11
43.659 6 1 12
Perhatikan bagaimana Peringkat berubah ketika kita menggunakan OrderQty (tabel kedua kolom paling kanan) di ORDER BY dan bagaimana perubahan ketika kita menggunakan SalesOrderDetailID (tabel pertama kolom paling kanan) di ORDER BY.
sumber
Saya belum melakukan apa pun dengan peringkat, tetapi saya menemukan ini hari ini dengan row_number ().
Ini akan menghasilkan beberapa nomor baris berulang karena dalam kasus saya setiap nama memegang semua item. Setiap barang akan dipesan berapa banyak yang terjual.
sumber