U kunt in uw analytische functie veel voorwaarden opgeven om te bestellen
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
Ik neem aan dat je dense_rank
. wilt aangezien je de dense_rank
. hebt gebruikt label. Je praat niet over hoe je met banden wilt omgaan of dat banden überhaupt mogelijk zijn, dus uit de vraag zelf wordt niet duidelijk of je de rank
wilt gebruiken , dense_rank
, of row_number
analytische functies. Als u alleen de hoogste rij per id
. ophaalt , rank
en dense_rank
zal zich identiek gedragen en zal meerdere rijen retourneren als er banden zijn voor de eerste plaats. row_number
zal altijd een enkele rij retourneren door de gelijkspel willekeurig te verbreken. Als u andere rijen wilt ophalen dan de eerste rij per id
, dan moet je nadenken over banden en krijg je ander gedrag dan rank
en dense_rank
. Als twee rijen gelijk zijn voor de eerste, dense_rank
zal de derde rij een rnk
toewijzen van 2 terwijl rank
zal het een rnk
toewijzen van 3.
Dit lijkt te werken voor de voorbeeldgegevens die je hebt gepost
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