Bạn có thể chỉ định nhiều điều kiện để sắp xếp trong hàm phân tích của mình
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
Tôi giả định rằng bạn muốn dense_rank
cho rằng bạn đã sử dụng dense_rank
nhãn. Bạn không nói về cách bạn muốn xử lý các mối quan hệ hoặc liệu các mối quan hệ có khả thi hay không, vì vậy không rõ ràng từ chính câu hỏi liệu bạn có muốn sử dụng rank
hay không , dense_rank
hoặc row_number
các hàm phân tích. Nếu bạn chỉ tìm nạp hàng xếp hạng cao nhất cho mỗi id
, rank
và dense_rank
sẽ hoạt động giống nhau và sẽ trả về nhiều hàng nếu có các ràng buộc cho vị trí đầu tiên. row_number
sẽ luôn trả về một hàng duy nhất bằng cách tự ý bẻ dây buộc. Nếu bạn muốn tìm nạp các hàng khác với hàng đầu tiên trên mỗi id
, sau đó bạn sẽ cần phải suy nghĩ về các mối quan hệ và bạn sẽ nhận được hành vi khác với rank
và dense_rank
. Nếu hai hàng được gắn cho đầu tiên, dense_rank
sẽ gán cho hàng thứ ba một rnk
của 2 trong khi rank
sẽ gán cho nó một rnk
của 3.
Điều này có vẻ hiệu quả với dữ liệu mẫu bạn đã đăng
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