Anda dapat menentukan banyak ketentuan untuk dipesan dalam fungsi analitik Anda
SELECT *
FROM (SELECT id,
col1,
col2,
col3,
dense_rank() over (partition by id
order by (case when col1 = 'xyz'
then 1
else 0
end) desc,
col2 asc,
col3 asc) rnk
FROM your_table)
WHERE rnk = 1
Saya berasumsi bahwa Anda ingin dense_rank
mengingat Anda menggunakan dense_rank
menandai. Anda tidak berbicara tentang bagaimana Anda ingin menangani ikatan atau apakah ikatan itu mungkin, jadi tidak jelas dari pertanyaan itu sendiri apakah Anda ingin menggunakan rank
, dense_rank
, atau row_number
fungsi analitik. Jika Anda hanya mengambil baris peringkat tertinggi per id
, rank
dan dense_rank
akan berperilaku identik dan akan mengembalikan beberapa baris jika ada ikatan untuk tempat pertama. row_number
akan selalu mengembalikan satu baris dengan memutuskan ikatan secara sewenang-wenang. Jika Anda ingin mengambil baris selain baris pertama per id
, maka Anda harus memikirkan ikatan dan Anda akan mendapatkan perilaku yang berbeda dari rank
dan dense_rank
. Jika dua baris pertama diikat, dense_rank
akan menetapkan baris ketiga sebuah rnk
dari 2 saat rank
akan memberinya rnk
dari 3.
Ini tampaknya berfungsi untuk data sampel yang Anda poskan
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select 1 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
3 select 1 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, 'A' col3 from dual union all
4 select 2 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
5 select 2 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
6 select 3 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
7 select 3 id, 'xyz' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
8 select 4 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
9 select 4 id, 'xyz' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
10 select 4 id, 'xyz' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual
11 )
12 SELECT *
13 FROM (SELECT id,
14 col1,
15 col2,
16 col3,
17 dense_rank() over (partition by id
18 order by (case when col1 = 'xyz'
19 then 1
20 else 0
21 end) desc,
22 col2 asc,
23 col3 asc) rnk
24 FROM x)
25* WHERE rnk = 1
SQL> /
ID COL COL2 C RNK
---------- --- --------- - ----------
1 abc 01-JAN-12 A 1
2 abc 01-JAN-12 1
3 xyz 01-JAN-12 1
4 xyz 01-JAN-12 1