Sie können in Ihrer Analysefunktion viele Bedingungen angeben, nach denen sortiert werden soll
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
Ich gehe davon aus, dass Sie dense_rank wollen vorausgesetzt, Sie haben den dense_rank verwendet Schild. Sie sprechen nicht darüber, wie Sie mit Unentschieden umgehen möchten oder ob Unentschieden überhaupt möglich sind, daher geht aus der Frage selbst nicht hervor, ob Sie den rank verwenden möchten , dense_rank , oder row_number analytische Funktionen. Wenn Sie immer nur die Zeile mit dem höchsten Rang pro id abrufen , rank und dense_rank verhält sich identisch und gibt mehrere Zeilen zurück, wenn es Unentschieden für den ersten Platz gibt. row_number wird immer eine einzelne Zeile zurückgeben, indem die Bindung willkürlich gebrochen wird. Wenn Sie andere Zeilen als die erste Zeile pro id abrufen möchten , dann müssen Sie über Bindungen nachdenken und Sie werden ein anderes Verhalten von rank erhalten und dense_rank . Wenn zwei Zeilen für die erste gleich sind, dense_rank weist der dritten Zeile einen rnk zu von 2 während rank weist ihm einen rnk zu von 3.
Dies scheint für die von Ihnen geposteten Beispieldaten zu funktionieren
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