Как найти минимальные записи, которые имеют уникальные значения в 2 разных столбцах - PullRequest
0 голосов
/ 12 марта 2019

У меня есть таблица, скажем TABLE_X, у которой есть уникальная пара значений в 2 столбцах. (См. Прикрепленное изображение) Однако я хотел бы свести к минимуму этот результат, если у меня есть по крайней мере одно значение из каждого из столбцов. Посмотрите на таблицу ниже. В COL_1 есть 4 уникальных буквы и в COL_2 6 уникальных. Я показал несколько разных решений, которые показывают, что каждое значение в каждом столбце представлено как-то. Я не ищу какой-либо конкретный результат, кроме как убедиться, что все значения представлены. Есть ли какая-нибудь функция или JOIN, которую я могу сделать в SQL, которая поможет достичь этого? Я попытался использовать функцию ROW_NUMBER(), но это не сработало, так как я не смог получить представление для обоих столбцов.

enter image description here

Ответы [ 2 ]

0 голосов
/ 13 марта 2019
with 
  t(c1, c2, path) as (
    select col_1, col_2, cast(col_1 as varchar2(1000)) from table_x where col_2 = 1 
    union all 
    select col_1, col_2, path||' - '||col_1 
      from table_x join t on col_2 = c2 + 1 ),
  s as (select t.*, row_number() over (order by path) sn from t where c2 = 6),
  d as (
    select sn, t.c1, t.c2, s.path, count(distinct t.c1) over (partition by sn) cnt
      from s join t on s.path like t.path||'%')
select * from d where cnt = 4 order by sn, c2

Демоверсия dbfiddle

  • t - рекурсивный запрос, генерирующий все возможные решения из ваших данных, здесьРешения построены как A - D - B - C - A - A и т. д.
  • s - t с добавленным номером решения sn
  • d - s, соединенным с t (для разворотаданные) и добавленное количество каждой отдельной буквы в решении

Наконец, я выбираю только решения, содержащие все четыре буквы.В данном конкретном случае есть 10 возможных решений, и возьмите все, что захотите.

Вы можете сделать это с любым набором данных, могут быть строки, числа и т. Д., Но сначала вы должны назначить им номера (с row_number ()), чтобы разрешить работу рекурсивного запроса.И в этом случае в запросе вы должны объединить решения с исходными данными, используя эти идентификаторы.

Также здесь я жестко закодировал 6 (цифры) и 4 (буквы), но вы можете легко посчитать их сначала.

0 голосов
/ 12 марта 2019

Это вроде глупо , но вроде работает .

SQL> with test (col1, col2) as
  2    (select 'A', 1 from dual union all
  3     select 'A', 2 from dual union all
  4     select 'A', 5 from dual union all
  5     select 'A', 6 from dual union all
  6     select 'B', 1 from dual union all
  7     select 'B', 3 from dual union all
  8     select 'B', 5 from dual union all
  9     select 'C', 2 from dual union all
 10     select 'C', 3 from dual union all
 11     select 'C', 4 from dual union all
 12     select 'C', 5 from dual union all
 13     select 'D', 2 from dual
 14    ),
 15  inter as
 16    (select col1, min(col2) col2 from test group by col1
 17     union
 18     select min(col1) col1, col2 from test group by col2
 19    )
 20  select col1, max(col2) col2 from inter group by col1
 21  union
 22  select max(col1) col1, col2 from inter group by col2;

C       COL2
- ----------
A          5
A          6
B          1
B          3
C          4
D          2

6 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...