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