另一种方法是使用Tabibitosan,如下所示:
WITH your_table AS (SELECT 1 col1, 'AAAA' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 2 col1, 'BBBB' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 3 col1, 'CCCC' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 4 col1, 'DDDD' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 5 col1, 'EEEE' col2, 'xxxx' col3 FROM DUAL UNION ALL
SELECT 6 col1, 'FFFF' col2, 'xxxx' col3 FROM DUAL)
SELECT col1,
col2,
col3
FROM (SELECT col1,
col2,
col3,
row_number() OVER (ORDER BY col1) - row_number() OVER (PARTITION BY col3 ORDER BY col1) grp
FROM your_table)
WHERE grp = 0;
COL1 COL2 COL3
---------- ---- ----
1 AAAA kkkk
2 BBBB kkkk
3 CCCC kkkk
4 DDDD kkkk
第二行与第一行不同的示例:
WITH your_table AS (SELECT 1 col1, 'AAAA' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 2 col1, 'BBBB' col2, 'aaaa' col3 FROM DUAL UNION ALL
SELECT 3 col1, 'CCCC' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 4 col1, 'DDDD' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 5 col1, 'EEEE' col2, 'xxxx' col3 FROM DUAL UNION ALL
SELECT 6 col1, 'FFFF' col2, 'xxxx' col3 FROM DUAL)
SELECT col1,
col2,
col3
FROM (SELECT col1,
col2,
col3,
row_number() OVER (ORDER BY col1) - row_number() OVER (PARTITION BY col3 ORDER BY col1) grp
FROM your_table)
WHERE grp = 0;
COL1 COL2 COL3
---------- ---- ----
1 AAAA kkkk
我建议您测试提供给您的所有解决方案,以找出对您的数据更有效的解决方案。
ETA:如果在您的实际数据中,您希望单独应用这些组,则只需将相关列添加到两个 row_number() 分析函数的 PARTITION BY 子句中,例如:
WITH your_table AS (SELECT 1 id, 1 col1, 'AAAA' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 1 id, 2 col1, 'BBBB' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 1 id, 3 col1, 'CCCC' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 1 id, 4 col1, 'DDDD' col2, 'kkkk' col3 FROM DUAL UNION ALL
SELECT 1 id, 5 col1, 'EEEE' col2, 'xxxx' col3 FROM DUAL UNION ALL
SELECT 1 id, 6 col1, 'FFFF' col2, 'xxxx' col3 FROM DUAL UNION ALL
SELECT 2 id, 7 col1, 'GGGG' col2, 'aaaa' col3 FROM DUAL UNION ALL
SELECT 3 id, 8 col1, 'HHHH' col2, 'cccc' col3 FROM DUAL UNION ALL
SELECT 2 id, 9 col1, 'IIII' col2, 'bbbb' col3 FROM DUAL UNION ALL
SELECT 3 id, 10 col1, 'JJJJ' col2, 'cccc' col3 FROM DUAL UNION ALL
SELECT 2 id, 11 col1, 'KKKK' col2, 'aaaa' col3 FROM DUAL UNION ALL
SELECT 3 id, 12 col1, 'LLLL' col2, 'cccc' col3 FROM DUAL)
SELECT id,
col1,
col2,
col3
FROM (SELECT id,
col1,
col2,
col3,
row_number() OVER (PARTITION BY ID ORDER BY col1) - row_number() OVER (PARTITION BY id, col3 ORDER BY col1) grp
FROM your_table)
WHERE grp = 0
ORDER BY ID, col1;
ID COL1 COL2 COL3
---------- ---------- ---- ----
1 1 AAAA kkkk
1 2 BBBB kkkk
1 3 CCCC kkkk
1 4 DDDD kkkk
2 7 GGGG aaaa
3 8 HHHH cccc
3 10 JJJJ cccc
3 12 LLLL cccc