my answer hereから適応:
SQL Fiddle
Oracleの11グラムR2スキーマのセットアップ:
CREATE TABLE ids (ID1, ID2) AS
SELECT 'A', 'B' FROM DUAL UNION ALL
SELECT 'C', 'B' FROM DUAL UNION ALL
SELECT 'A', 'F' FROM DUAL UNION ALL
SELECT 'G', 'B' FROM DUAL UNION ALL
SELECT 'G', 'E' FROM DUAL UNION ALL
SELECT 'J', 'B' FROM DUAL UNION ALL
SELECT 'X', 'Y' FROM DUAL UNION ALL
SELECT 'Z', 'Y' FROM DUAL;
クエリ1:
WITH indexed_ids (id, id1, id2) AS (
SELECT ROWNUM, id1, id2 FROM ids
),
grouped_ids (id, id1, id2, min_id) AS (
SELECT i.*,
LEAST(
MIN(id) OVER (PARTITION BY id1),
MIN(id) OVER (PARTITION BY id2)
) AS min_id
FROM indexed_ids i
)
SELECT id, id1, id2,
MIN("GROUP") AS "GROUP"
FROM (
SELECT id, id1, id2,
CONNECT_BY_ROOT(id) AS "GROUP"
FROM grouped_ids g
START WITH id = min_id
CONNECT BY NOCYCLE (PRIOR id1 IN (id1, id2) OR PRIOR id2 IN (id1, id2))
)
GROUP BY id, id1, id2
ORDER BY id
Results:
| ID | ID1 | ID2 | GROUP |
|----|-----|-----|-------|
| 1 | A | B | 1 |
| 2 | C | B | 1 |
| 3 | A | F | 1 |
| 4 | G | B | 1 |
| 5 | G | E | 1 |
| 6 | J | B | 1 |
| 7 | X | Y | 7 |
| 8 | Z | Y | 7 |
GROUP
列は、グループの最小ID
を識別する。シーケンシャルな場合は、GROUP
を、DENSE_RANK()
の解析関数を使用できます。
出典
2017-09-20 12:23:16
MT0
最初の2つの行が「X | Y "と" Z | Y " - それはグループ1になりますか?また、物事を明確にするために、列ID1の値が複数回出現する場合、または列ID2の値が2回以上出現した場合最後のステートメントが正しい場合、順序は何ですか;前述したように、最後の2つの行が最初に返された場合、それらはグループ1になりますか? – g00dy
ORDERingは問題ありません。 Y "は最初になり、" Z | Y "は最後であり、それは1つのグループです(グループの番号付けはサンプルであり、GROUP列の値として1,1,2,1,3を持つことができます)。 –