用于合并2×2行的sql函数(Oracle db)

用于合并2×2行的sql函数(Oracle db),sql,oracle,Sql,Oracle,我有一个表(在Oracle数据库中),如: 我的任务是按myid组合它们,但一次只能组合两行。所以这里的出口应该是: 1 'abcdef' 1 'ghi' 2 'jjjjjj' 3 'kkk' 一个id可以有多行。如果一个id有11行,函数应该为该id返回6行(1+2,3+4,5+6,7+8,9+10,11) 函数应该看起来像getCombinedRowsForId(Id number)或者甚至可能是getCombinedRows(),并且它应该返回整个数据表 有什么想法吗?谢谢 SELECT

我有一个表(在Oracle数据库中),如:

我的任务是按myid组合它们,但一次只能组合两行。所以这里的出口应该是:

1 'abcdef'
1 'ghi'
2 'jjjjjj'
3 'kkk'
一个id可以有多行。如果一个id有
11行
,函数应该为该id返回
6行
(1+2,3+4,5+6,7+8,9+10,11)

函数应该看起来像
getCombinedRowsForId(Id number)
或者甚至可能是
getCombinedRows()
,并且它应该返回整个数据表

有什么想法吗?谢谢

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和
listag()
将组中的行合并在一起


注意:仅适用于Oracle 11g+

您可以合并“最后”两行吗?或者哪两行很重要?编辑得很好..谢谢。我会努力从中学到一些东西。米海-哪两排都不重要。它可以是(第1行+第3行作为returnRow1,第2行+第11行作为returnRow2,…,第9行作为returnRow6)。只是不能复制。准确地说:这需要11g版本2(又名11.2)<代码>列表标记()在11.1中不可用
      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