PL SQL Нахождение и пусть ряд мудрых дубликатов - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть таблица с 10 столбцами. Выглядит так:

NULL 1 1 NULL NULL NULL NULL NULL 2 NULL
1 NULL NULL 2 NULL 1 NULL NULL 2 NULL
NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL NULL NULL 2 NULL

Мне нужен SQL Запрос, который возвращает это: (различно по строкам)

1 2
1 2
NULL
2

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Вы можете использовать hiearchy query следующим образом:

SELECT LISTAGG(E, ' ') WITHIN GROUP( ORDER BY E )
FROM
    ( SELECT DISTINCT
            ROWID AS RID,
            DECODE(COLUMN_VALUE, 1, COL1, 2, COL2, 3, COL3, 4, COL4 ..., 10, COL10) AS E
        FROM YOUR_TABLE
             CROSS JOIN TABLE ( CAST(MULTISET(
                SELECT LEVEL
                  FROM DUAL
                CONNECT BY LEVEL <= 10 ) AS SYS.ODCINUMBERLIST) )
    )
GROUP BY RID;
0 голосов
/ 15 апреля 2020

Вы можете UNPIVOT преобразовать столбцы в строки (и сохранить значения NULL), а затем отфильтровать, чтобы сохранить строки DISTINCT, а затем объединить строки в строку, игнорируя значения NULL, если они не все NULL:

SELECT LISTAGG( value, ' ' ) WITHIN GROUP ( ORDER BY value ) AS vals
FROM   (
  SELECT DISTINCT
         rn,
         value,
         COUNT(value) OVER ( PARTITION BY rn ) AS num_values
  FROM   (
    SELECT ROWNUM AS rn,
           t.*
    FROM   table_name t
  )
  UNPIVOT INCLUDE NULLS (
    value FOR key IN ( col1, col2, col3, col4, col5, col6, col7, col8, col9, col10 )
  )
)
WHERE num_values = 0
OR    value IS NOT NULL
GROUP BY rn

Итак, для ваших выборочных данных:

CREATE TABLE table_name (
  col1 NUMBER,
  col2 NUMBER,
  col3 NUMBER,
  col4 NUMBER,
  col5 NUMBER,
  col6 NUMBER,
  col7 NUMBER,
  col8 NUMBER,
  col9 NUMBER,
  col10 NUMBER
);

INSERT INTO table_name
SELECT NULL,    1,    1, NULL, NULL, NULL, NULL, NULL,    2, NULL FROM DUAL UNION ALL
SELECT    1, NULL, NULL,    2, NULL,    1, NULL, NULL,    2, NULL FROM DUAL UNION ALL
SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM DUAL UNION ALL
SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,    2, NULL FROM DUAL;

Это выводит:

| VALS |
| :--- |
| 1 2  |
| 1 2  |
| <em>null</em> |
| 2    |

дБ <> скрипка здесь

0 голосов
/ 15 апреля 2020

Попробуйте ниже, если это поможет попытаться развинтить столбцы в 1, исключив пустые значения, сохраняя идентификатор строки для каждого предыдущего выбора перед его отменой, а затем агрегируя с помощью группировки

    Select op from (Select rn, 
     listagg(distinct col, 
       ',') within group (order by 
         col) as  op from
   (  Select *, row_number() over(
    Partition by col1, col2.. Col10 order by
   ..) rn
     from table
    UnPIVOT 
  (COL, num) IN   ( (COL1, COL2,... 
     Col10), rn)) 

   ) where col is not null group by 
  rn) 
...