2014-01-21 2 views
1

У меня есть таблица (в базе данных Oracle), как:SQL функция для зерноуборочных 2 от 2 строк (Oracle DB)

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, но только 2 строки, в то время , Поэтому выход здесь должен быть:

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

Один идентификатора может иметь много rows..if есть 11 rows для одного идентификатора, функция должна возвращать 6 rows для этого идентификатора (1+2, 3+4, 5+6, 7+8, 9+10, 11).

Функция должна, вероятно, выглядеть как getCombinedRowsForId(Id number) или даже getCombinedRows(), и она должна возвращать всю таблицу данных.

любые идеи? Благодарю.

+0

Вы можете объединить «последние» два ряда или делает это независимо от того, какие 2 строки? – Mihai

+0

приятный монтаж..thanks. попытается что-то узнать от него. – NinjaOnTilt

+0

Михай - неважно, какие 2 строки. это может быть (row1 + row3 как returnRow1, row2 + row11 как returnRow2, ..., row9 as 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 

, а затем с помощью группы MyID, Подранг И LISTAGG() concats строк в группе вместе.

Примечание: работы с Oracle 11g + только

+0

приятно. будет отмечать его, когда я проверю это. На данный момент – NinjaOnTilt

+2

Для уточнения: для этого требуется 11g ** Release 2 ** (aka 11.2). 'listagg()' недоступен в 11.1 –

+0

Maheswaran Ravisankar Amazing. Он отлично работает. Большое спасибо! – NinjaOnTilt

Смежные вопросы