我有一个表(在Oracle数据库中),如:
myid | data1 | data2 | data3
1 'a' 'b' 'c'
1 'd' 'e' 'f'
1 'g' 'h' 'i'
2 'j' 'j' 'j'
2 'j' 'j' 'j'
3 'k' 'k' 'k'
我有一个任务是通过myid组合它们,但一次只能有两行。所以这里的退出应该是:
1 'abcdef'
1 'ghi'
2 'jjjjjj'
3 'kkk'
一个ID可以包含多行...如果一个ID有11 rows
,则该函数应返回6 rows
作为该ID (1+2, 3+4, 5+6, 7+8, 9+10, 11)
。
函数应该看起来像getCombinedRowsForId(Id number)
或甚至getCombinedRows()
,它应该返回一整个数据表。
任何想法?感谢。
答案 0 :(得分:2)
SELECT myid,
LISTAGG(data,'') WITHIN GROUP (
ORDER BY rank)
FROM
(SELECT myid,
data1||data2||data3 AS data,
row_number() over (order by 1) AS rank,
CASE MOD((row_number() over (partition by myid order by 1)),2)
WHEN 1
THEN row_number() over (partition by myid order by 1)
ELSE row_number() over (partition by myid order by 1) -1
END AS sub_rank
FROM your_table
)
GROUP BY myid, sub_rank;
它首先生成一个像
的视图 MYID DATA RANK SUB_RANK
---------- -------------------- ---------- ----------
1 abb 1 1
1 dee 2 1
1 ghh 3 3
2 jjj 4 1
2 jjj 5 1
3 kkk 6 1
然后使用myid进行分组,使用subrank和LISTAGG()
将组中的行汇总在一起。
注意:仅适用于Oracle 11g +