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

Đặt từ một bảng, được nhóm theo cột

Vấn đề này thực sự trông đơn giản hơn câu trả lời cho câu hỏi bạn đã liên kết, đó là một giải pháp tuyệt vời cho vấn đề đó. Tuy nhiên, điều này sử dụng các truy vấn phân cấp giống nhau, với connect by

Nếu đó là trường hợp priority luôn là một dãy số liên tục, điều này sẽ hoạt động

SELECT t.grp, level, ltrim(SYS_CONNECT_BY_PATH(state,','),',')   as "set"  
   from  t 
   start with priority = 1
 connect by   priority = prior priority + 1
            and grp = prior grp

Tuy nhiên, nếu điều đó không phải lúc nào cũng đúng, chúng tôi sẽ yêu cầu row_number() để xác định trình tự dựa trên thứ tự ưu tiên (không cần là số nguyên liên tiếp)

with t2 AS
( 
  select t.*, row_number() 
        over ( partition by grp order by priority) as rn from t
)
SELECT t2.grp, ltrim(SYS_CONNECT_BY_PATH(state,','),',')   as "set"
   from  t2 
   start with priority = 1
 connect by   rn = prior rn + 1
            and grp = prior grp

DEMO



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có nên phân vùng / phân vùng con bảng của mình không?

  2. Gọi một lệnh gọi hàm trong một chuỗi trong một Thủ tục Oracle

  3. Oracle 12.2.0.1 sắp ra mắt vào năm 2016

  4. Oracle nhóm một phần của hàng và nhận hàng với dấu thời gian mới nhất

  5. Chuyển đổi dấu thời gian thành ngày tháng trong Oracle SQL