Как сформировать шаблон данных в 1 строку

У меня есть требование записи записей таблицы в плоский файл. Вот требование: я должен найти все столбцы, для которых столбцы фильтрации одинаковы, в этом случае строки должны быть записаны в одной строке в плоском файле с именем столбца как prefix для ценности. Здесь col1 и col2 должны сформировать уникальную запись.

Входная таблица:

col1 col2 col3 col4  
A    B     1    HELLO  
C    X     5    DEMO  
A    B     2    TEXT  

Выход :

A B col31,col4HELLO col32,col4TEXT  
C X col35,col4DEMO

person Bisu    schedule 26.08.2017    source источник
comment
Что вы имеете в виду под columns for which the filtering columns are same ? Какие столбцы являются фильтрующими столбцами в вашем примере, какие одинаковые, а какие разные и почему? Пожалуйста, объясни.   -  person krokodilko    schedule 26.08.2017
comment
Здесь столбцы col1 и col2 должны совпадать, так как col1 =A и col2 =B соответствуют 2 записям из 3.   -  person Bisu    schedule 26.08.2017
comment
Итак, вы хотите сначала проверить все возможные комбинации столбцов (2 или более столбцов): (col1,col2), (col1, col3), ...... (col2, col4) ... (col1,col2,col3), (col1,col2,col4) ....., если существуют дублированные записи (более 1 записи) для данной комбинации столбцов, а затем для этих дублированных записей и комбинаций вы хотите создать плоский файл с данными. Я прав или может быть я что-то не понимаю?   -  person krokodilko    schedule 26.08.2017
comment
Да, это правильно   -  person Bisu    schedule 26.08.2017
comment
Итак, для 100 столбцов количество комбинаций различных пар из двух столбцов будет равно ( (100! )/( 2! * (100-2) ! ) = 4950. Наивный алгоритм сгенерирует все эти 4950 комбинаций столбцов, а затем запросит таблицу 4095 раз в цикле, чтобы получить повторяющиеся строки.   -  person krokodilko    schedule 26.08.2017


Ответы (1)


Вот решение, которое работает с опубликованными образцами данных и выводом. Он работает в два этапа: соедините столбцы для каждой строки, затем используйте LISTAGG() для объединения всех строк для комбинаций col1, col2.

SQL> with cte as (
  2     select col1
  3            , col2
  4            , 'col3:' || col3 ||' col4:' || col4 as col3col4
  5            , row_number() over (partition by col1, col2 order by col1, col2) as rn
  6     from input_table
  7  )
  8  select col1
  9         , col2
 10         , listagg(col3col4, ' ') within group (order by rn) as concat_output
 11  from cte
 12  group by col1, col2;

COL1 COL2 CONCAT_OUTPUT
---- ---- ----------------------------------------
A    B    col3:2 col4:TEXT col3:1 col4:HELLO
C    X    col3:5 col4:DEMO
SQL> 
person APC    schedule 26.08.2017