Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Truy vấn SQL Chọn xếp hạng đầu tiên 1 hàng Từ nhiều cấp bậc / Nhóm

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 , rankdense_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 rankdense_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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sai số hoặc loại đối số khi gọi Stored Proc

  2. Khi thiết kế cơ sở dữ liệu, cách ưu tiên để lưu trữ nhiều giá trị true / false là gì?

  3. Truy vấn hoạt động trên Oracle 11g nhưng không thành công trên Oracle 8i

  4. sự cố trong Tạo số trong Trình tự sử dụng Cache

  5. PDO_OCI - vào một trường tắc nghẽn