2014-01-21 49 views
1

我有一個表(在Oracle數據庫),如:在一個時間SQL函數結合2×2行(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' 

我有一個任務通過身份識別碼把它們結合在一起,但只有2行。所以這裏的退出應該是:

1 'abcdef' 
1 'ghi' 
2 'jjjjjj' 
3 'kkk' 

一個ID可以有很多rows..if有11 rows一個ID,功能應該爲ID (1+2, 3+4, 5+6, 7+8, 9+10, 11)返回6 rows

功能應該看起來像getCombinedRowsForId(Id number)或甚至getCombinedRows()它應該返回一個完整的數據表。

什麼想法?謝謝。

+0

你可以結合「最後」兩行或者它無論哪2行? – Mihai

+0

不錯的編輯..謝謝。會嘗試從中學習一些東西。 – NinjaOnTilt

+0

Mihai - 哪兩行並不重要。它可以是(row1 + row3作爲returnRow1,row2 + row11作爲returnRow2,...,row9作爲returnRow6)。只是不能重複。 – NinjaOnTilt

回答

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 

,然後使用本身份識別碼,subrank AND LISTAGG() concats的組中的行一起組。

注:與工程的Oracle 11g +僅

+0

不錯。當我測試這個時會標記它。現在感謝 – NinjaOnTilt

+2

準確地說:這需要11g **第2版**(又名11.2)。 'listagg()'不適用於11.1 –

+0

Maheswaran Ravisankar令人驚歎。它效果很好。非常感謝! – NinjaOnTilt