Выберите уникальные комбинации (уникальные с обеих сторон) - PullRequest
0 голосов
/ 19 сентября 2018

РЕДАКТИРОВАТЬ : добавлена ​​ссылка на Fiddle для более полного образца (фактический набор данных)


Интересно, возможно ли приведенное ниже в SQL, в BigQueryв частности, и в одном операторе SELECT.

Рассмотрим следующий ввод:

  Key | Value 
 -----|------- 
  a   |     2 
  a   |     3 
  b   |     2 
  b   |     3 
  b   |     5 
  c   |     2
  c   |     5 
  c   |     7 

Логика: выберите наименьшее значение «доступно» для каждой клавиши.Доступное значение еще не назначено / не использовано.См. Ниже.

  Key | Value |                    Rule                    
 -----|-------|-------------------------------------------- 
  a   |     2 | keep                                       
  a   |     3 | ignore because key "a" has a value already 
  b   |     2 | ignore because value "2" was already used  
  b   |     3 | keep                                       
  b   |     5 | ignore because key "b" has a value already 
  c   |     2 | ignore because value "2" was already used  
  c   |     5 | keep                                       
  c   |     7 | ignore because key "c" has a value already 

Отсюда ожидаемый результат:

  Key | Value 
 -----|------- 
  a   |     2 
  b   |     3 
  c   |     5 

Здесь SQL для создания фиктивной таблицы:

with t as ( select 
'a' key, 2 value UNION ALL select 'a', 3 
UNION ALL select 'b', 2 UNION ALL select 'b', 3 UNION ALL select 'b', 5
UNION ALL select 'c', 2 UNION ALL select 'c', 5 UNION ALL select 'c', 7 
)
select * from t

EDIT : здесь другой набор данных

Не уверен, какую комбинацию функций FULL JOIN, DISTINCT, ARRAY или WINDOW я могу использовать.

Любое руководство приветствуется.

1 Ответ

0 голосов
/ 19 сентября 2018

РЕДАКТИРОВАТЬ : Это неправильный ответ, который работал с исходным примером набора данных, но имеет проблемы (как видно из полной выборки).Я оставляю это здесь, чтобы сохранить историю комментариев.


У меня нет конкретного BigQuery ответа, но вот одно SQL решение, использующее Общее табличное выражение и рекурсию.

WITH MyCTE AS 
(
  /* ANCHOR SUBQUERY */
  SELECT MyKey, MyValue 
  FROM MyTable t
  WHERE t.MyKey = (SELECT MIN(MyKey) FROM MyTable)

  UNION ALL

  /* RECURSIVE SUBQUERY */
  SELECT t.MyKey, t.MyValue
  FROM MyTable t
  INNER JOIN MyCTE c 
     ON c.MyKey < t.MyKey
    AND c.MyValue < t.MyValue
)

SELECT MyKey, MIN(MyValue)
FROM MyCTE 
GROUP BY MyKey
;

Результаты:

  Key | Value 
 -----|------- 
  a   |     2 
  b   |     3 
  c   |     5 

SQL Fiddle

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