用于组合2乘2行的sql函数(Oracle db)

时间:2014-01-21 11:05:55

标签: sql oracle

我有一个表(在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(),它应该返回一整个数据表。

任何想法?感谢。

1 个答案:

答案 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 +