PERINGKAT memberi Anda peringkat dalam partisi yang Anda pesan. Dasi diberi peringkat yang sama, dengan peringkat berikutnya dilewati. Jadi, jika Anda memiliki 3 item di peringkat 2, peringkat berikutnya yang terdaftar akan menjadi peringkat 5.
DENSE_RANK lagi memberi Anda peringkat dalam partisi yang Anda pesan, tetapi peringkatnya berturut-turut. Tidak ada peringkat yang dilewati jika ada peringkat dengan beberapa item.
Adapun nol, itu tergantung pada klausa ORDER BY. Berikut ini adalah skrip tes sederhana yang dapat Anda mainkan untuk melihat apa yang terjadi:
with q as(select10 deptno,'rrr' empname,10000.00 sal from dual unionallselect11,'nnn',20000.00from dual unionallselect11,'mmm',5000.00from dual unionallselect12,'kkk',30000from dual unionallselect10,'fff',40000from dual unionallselect10,'ddd',40000from dual unionallselect10,'bbb',50000from dual unionallselect10,'xxx',nullfrom dual unionallselect10,'ccc',50000from dual)select empname, deptno, sal
, rank()over(partitionby deptno orderby sal nulls first) r
, dense_rank()over(partitionby deptno orderby sal nulls first) dr1
, dense_rank()over(partitionby deptno orderby sal nulls last) dr2
from q;
EMP DEPTNO SAL R DR1 DR2
--- ---------- ---------- ---------- ---------- ----------
xxx 10114
rrr 1010000221
fff 1040000332
ddd 1040000332
ccc 1050000543
bbb 1050000543
mmm 115000111
nnn 1120000222
kkk 12300001119rows selected.
Berikut tautan ke penjelasan yang bagus dan beberapa contoh.
ide yang sangat bagus untuk menggunakan serikat pilih semua dari dua untuk menghasilkan data sampel tanpa membuat tabel apa pun
Jean-Christophe Blanchard
@ Jean-ChristopheBlanchard meskipun Anda bisa dengan mudah menggunakan valuesklausa.
Wildcard
1
@ Kartu Memori Di PG, ya. Di Oracle, tidak . Setidaknya bukan pada 11. Aku belum bertemu dengan 12 dalam prod belum.
jpmc26
Hapus from dualuntuk menghasilkan data ini di Redshift
Gaurav
4
Ivan, RANK memberi saya ide di mana saya relatif terhadap semua yang ada di depan saya. DENSE_RANK memberi tahu saya peringkat absolut. Saya mungkin memiliki gaji tertinggi kedua, tetapi mungkin ada 100 orang di depan saya. Mana yang lebih baik tergantung pada pertanyaan yang saya jawab.
CREATETABLE t ASSELECT'a' v FROM dual UNIONALLSELECT'a'FROM dual UNIONALLSELECT'a'FROM dual UNIONALLSELECT'b'FROM dual UNIONALLSELECT'c'FROM dual UNIONALLSELECT'c'FROM dual UNIONALLSELECT'd'FROM dual UNIONALLSELECT'e'FROM dual;SELECT
v,
ROW_NUMBER()OVER(ORDERBY v) row_number,
RANK()OVER(ORDERBY v) rank,
DENSE_RANK()OVER(ORDERBY v) dense_rank
FROM t
ORDERBY v;
Di atas akan menghasilkan:
+---+------------+------+------------+| V | ROW_NUMBER | RANK | DENSE_RANK |+---+------------+------+------------+| a |1|1|1|| a |2|1|1|| a |3|1|1|| b |4|4|2|| c |5|5|3|| c |6|5|3|| d |7|7|4|| e |8|8|5|+---+------------+------+------------+
Dalam kata kata
ROW_NUMBER() atribut nilai unik untuk setiap baris
RANK() atribut nomor baris yang sama dengan nilai yang sama, meninggalkan "lubang"
DENSE_RANK() atribut nomor baris yang sama dengan nilai yang sama, tidak meninggalkan "lubang"
pangkat() : Ini digunakan untuk memberi peringkat catatan dalam kelompok baris.
dense_rank () : Fungsi DENSE_RANK bertindak seperti fungsi RANK kecuali bahwa ia memberikan peringkat berurutan.
Permintaan -
select
ENAME,SAL,RANK()over(orderby SAL) RANK
from
EMP;
Keluaran -
+--------+------+------+| ENAME | SAL | RANK |+--------+------+------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|6|+--------+------+------+
Permintaan -
select
ENAME,SAL,dense_rank()over(orderby SAL) DEN_RANK
from
EMP;
Keluaran -
+--------+------+-----------+| ENAME | SAL | DEN_RANK |+--------+------+-----------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|5|+--------+------+-----------+
Satu-satunya perbedaan antara fungsi RANK () dan DENSE_RANK () adalah dalam kasus di mana ada "dasi"; yaitu, dalam kasus di mana beberapa nilai dalam satu set memiliki peringkat yang sama. Dalam kasus seperti itu, RANK () akan menetapkan "peringkat" non-berurutan ke nilai-nilai dalam set (menghasilkan kesenjangan antara nilai peringkat integer ketika ada dasi), sedangkan DENSE_RANK () akan menetapkan peringkat berturut-turut ke nilai-nilai dalam set (jadi tidak akan ada kesenjangan antara nilai peringkat integer dalam kasus seri).
Misalnya, pertimbangkan set {25, 25, 50, 75, 75, 100}. Untuk set semacam itu, RANK () akan mengembalikan {1, 1, 3, 4, 4, 6} (perhatikan bahwa nilai 2 dan 5 dilewati), sedangkan DENSE_RANK () akan mengembalikan {1,1,2,3, 3,4}.
Peringkat () Fungsi SQL menghasilkan peringkat data dalam kumpulan nilai yang diurutkan, tetapi peringkat berikutnya setelah peringkat sebelumnya adalah row_number dari baris tersebut. Di sisi lain, fungsi Dense_Rank () SQL menghasilkan nomor berikutnya daripada menghasilkan row_number. Di bawah ini adalah contoh SQL yang akan menjelaskan konsep:
Rank(), Dense_rank(), row_number()
Ini semua adalah fungsi jendela yang berarti mereka bertindak sebagai jendela pada beberapa input yang diatur pada awalnya. Jendela-jendela ini memiliki fungsi berbeda yang dilampirkan berdasarkan kebutuhan. Inilah 3 di atas:
row_number()
Dimulai dengan row_number()ini sebagai dasar dari fungsi-fungsi jendela terkait ini. row_number()seperti namanya memberikan nomor unik untuk set baris yang telah diterapkan. Mirip dengan memberikan nomor seri untuk setiap baris.
Rank()
Subversi dari row_number()dapat dikatakan sebagai rank(). Rank () digunakan untuk memberikan nomor seri yang sama dengan baris-baris yang dipesan yang merupakan duplikat tetapi tetap menjaga jumlah dipertahankan sebagai mirip dengan row_number()untuk semua orang setelah duplikat peringkat () yang berarti dari bawah misalnya misalnya. Untuk data 2 row_number () = rank () yang berarti keduanya hanya berbeda dalam bentuk duplikat.
Data row_number() rank() dense_rank()1111121113112442
Akhirnya,
Dense_rank () adalah versi lanjutan dari peringkat () karena namanya menunjukkan kepadatannya karena seperti yang Anda lihat dari contoh peringkat di atas () = dense_rank () untuk semua data 1 tetapi hanya untuk data 2 berbeda dalam bentuk yang mempertahankan urutan peringkat () dari peringkat sebelumnya () bukan data aktual
Satu-satunya perbedaan antara fungsi RANK () dan DENSE_RANK () adalah dalam kasus di mana ada "dasi"; yaitu, dalam kasus di mana beberapa nilai dalam satu set memiliki peringkat yang sama. Dalam kasus seperti itu, RANK () akan menetapkan "peringkat" non-berurutan ke nilai-nilai dalam set (menghasilkan kesenjangan antara nilai peringkat integer ketika ada dasi), sedangkan DENSE_RANK () akan menetapkan peringkat berturut-turut ke nilai-nilai dalam set (jadi tidak akan ada kesenjangan antara nilai peringkat integer dalam kasus seri).
Misalnya, pertimbangkan set {30, 30, 50, 75, 75, 100}. Untuk set semacam itu, RANK () akan mengembalikan {1, 1, 3, 4, 4, 6} (perhatikan bahwa nilai 2 dan 5 dilewati), sedangkan DENSE_RANK () akan mengembalikan {1,1,2,3, 3,4}.
values
klausa.from dual
untuk menghasilkan data ini di RedshiftArtikel ini dengan baik menjelaskannya. Pada dasarnya, Anda dapat melihatnya seperti ini:
Di atas akan menghasilkan:
Dalam kata kata
ROW_NUMBER()
atribut nilai unik untuk setiap barisRANK()
atribut nomor baris yang sama dengan nilai yang sama, meninggalkan "lubang"DENSE_RANK()
atribut nomor baris yang sama dengan nilai yang sama, tidak meninggalkan "lubang"sumber
sumber
pangkat() : Ini digunakan untuk memberi peringkat catatan dalam kelompok baris.
dense_rank () : Fungsi DENSE_RANK bertindak seperti fungsi RANK kecuali bahwa ia memberikan peringkat berurutan.
Permintaan -
Keluaran -
Permintaan -
Keluaran -
sumber
Row_number()
-> Digunakan untuk menghasilkan nomor seriDense_rank()
akan memberikan peringkat terus menerus tetapi peringkat akan melewati peringkat dalam kasus clash of rank.sumber
Satu-satunya perbedaan antara fungsi RANK () dan DENSE_RANK () adalah dalam kasus di mana ada "dasi"; yaitu, dalam kasus di mana beberapa nilai dalam satu set memiliki peringkat yang sama. Dalam kasus seperti itu, RANK () akan menetapkan "peringkat" non-berurutan ke nilai-nilai dalam set (menghasilkan kesenjangan antara nilai peringkat integer ketika ada dasi), sedangkan DENSE_RANK () akan menetapkan peringkat berturut-turut ke nilai-nilai dalam set (jadi tidak akan ada kesenjangan antara nilai peringkat integer dalam kasus seri).
Misalnya, pertimbangkan set {25, 25, 50, 75, 75, 100}. Untuk set semacam itu, RANK () akan mengembalikan {1, 1, 3, 4, 4, 6} (perhatikan bahwa nilai 2 dan 5 dilewati), sedangkan DENSE_RANK () akan mengembalikan {1,1,2,3, 3,4}.
sumber
Peringkat () Fungsi SQL menghasilkan peringkat data dalam kumpulan nilai yang diurutkan, tetapi peringkat berikutnya setelah peringkat sebelumnya adalah row_number dari baris tersebut. Di sisi lain, fungsi Dense_Rank () SQL menghasilkan nomor berikutnya daripada menghasilkan row_number. Di bawah ini adalah contoh SQL yang akan menjelaskan konsep:
Ini akan menghasilkan output sebagai berikut:
sumber
Rank dan Dense rank memberikan peringkat dalam dataset yang dipartisi.
Rangking (): Ini tidak memberi Anda angka integer berurutan.
Dense_rank (): Ini memberi Anda angka integer berurutan.
Dalam gambar di atas, pangkat 10008 zip adalah fungsi 2 oleh dense_rank () dan fungsi 24 oleh peringkat () karena dianggap sebagai row_number.
sumber
Rank(), Dense_rank(), row_number()
Ini semua adalah fungsi jendela yang berarti mereka bertindak sebagai jendela pada beberapa input yang diatur pada awalnya. Jendela-jendela ini memiliki fungsi berbeda yang dilampirkan berdasarkan kebutuhan. Inilah 3 di atas:row_number()
Dimulai dengan
row_number()
ini sebagai dasar dari fungsi-fungsi jendela terkait ini.row_number()
seperti namanya memberikan nomor unik untuk set baris yang telah diterapkan. Mirip dengan memberikan nomor seri untuk setiap baris.Rank()
Subversi dari
row_number()
dapat dikatakan sebagairank()
. Rank () digunakan untuk memberikan nomor seri yang sama dengan baris-baris yang dipesan yang merupakan duplikat tetapi tetap menjaga jumlah dipertahankan sebagai mirip denganrow_number()
untuk semua orang setelah duplikat peringkat () yang berarti dari bawah misalnya misalnya. Untuk data 2 row_number () = rank () yang berarti keduanya hanya berbeda dalam bentuk duplikat.Akhirnya,
Dense_rank () adalah versi lanjutan dari peringkat () karena namanya menunjukkan kepadatannya karena seperti yang Anda lihat dari contoh peringkat di atas () = dense_rank () untuk semua data 1 tetapi hanya untuk data 2 berbeda dalam bentuk yang mempertahankan urutan peringkat () dari peringkat sebelumnya () bukan data aktual
sumber
Satu-satunya perbedaan antara fungsi RANK () dan DENSE_RANK () adalah dalam kasus di mana ada "dasi"; yaitu, dalam kasus di mana beberapa nilai dalam satu set memiliki peringkat yang sama. Dalam kasus seperti itu, RANK () akan menetapkan "peringkat" non-berurutan ke nilai-nilai dalam set (menghasilkan kesenjangan antara nilai peringkat integer ketika ada dasi), sedangkan DENSE_RANK () akan menetapkan peringkat berturut-turut ke nilai-nilai dalam set (jadi tidak akan ada kesenjangan antara nilai peringkat integer dalam kasus seri).
Misalnya, pertimbangkan set {30, 30, 50, 75, 75, 100}. Untuk set semacam itu, RANK () akan mengembalikan {1, 1, 3, 4, 4, 6} (perhatikan bahwa nilai 2 dan 5 dilewati), sedangkan DENSE_RANK () akan mengembalikan {1,1,2,3, 3,4}.
sumber