SQL - Создать массив на основе значений двух других столбцов - PullRequest
2 голосов
/ 24 марта 2020

У меня есть следующие данные:

-----------------------------------------
| client_id | link_hash_a | link_hash_b |
-----------------------------------------
|     1     |     abc     |     xyz     |
|     2     |     def     |     xyz     |
|     3     |     def     |     uvw     |
-----------------------------------------

Я хотел бы создать массив client_id, который связан с двумя значениями ha sh из столбцов link_hash_a и link_hash_b, используя SQL.

В текущей ситуации результатом будет уникальный массив со значением {1,2,3}, поскольку клиенты 1 и 2 связаны со значением xyz столбца link_hash_b, а клиенты 2 и 3 связаны со значением def столбца link_hash_a.

Есть ли способ сделать это с помощью запроса SQL? Большое спасибо за ваш вклад.

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

В качестве альтернативы можно использовать этот способ:

SELECT groupUniqArrayArray(client_ids) client_ids
FROM (
  SELECT link_hash, groupArray(client_id) client_ids
  FROM (
    SELECT DISTINCT client_id, arrayJoin([link_hash_a, link_hash_b]) as link_hash
    FROM (
      /* test data */
      SELECT data.1 client_id, data.2 link_hash_a, data.3 link_hash_b
      FROM (
        SELECT arrayJoin([
          (1, 'abc', 'xyz'),
          (2, 'def', 'xyz'),
          (3, 'def', 'uvw')]) data)))
  GROUP BY link_hash
  HAVING count() = 2)
/* result
┌─client_ids─┐
│ [2,1,3]    │
└────────────┘
*/
0 голосов
/ 24 марта 2020

Я думаю, что нашел выход. Я использовал другой столбец, который является club_id, частью которого являются клиенты. В этом случае все клиенты 1, 2 и 3 являются, например, частью club_id 1.

Вот мой код с использованием ClickHouse SQL и с учетом того, что input_table является таблицей данные, как показано в вопросе:

SELECT club_id, arrayConcat( clt_a, clt_b ) as tot_clt_arr, arrayUniq( arrayConcat( clt_a, clt_b ) ) as tot_clt
FROM
(
    SELECT club_id, clt_a
    FROM
        (
        SELECT club_id, link_hash_a, groupUniqArray(client_id) as clt_a
        FROM input_table
        GROUP BY club_id, link_hash_a
        )
    WHERE length(clt_a) >= 2
) JOIN
(
    SELECT club_id, clt_b
    FROM
        (
        SELECT club_id, link_hash_b, groupUniqArray(client_id) as clt_b
        FROM input_table
        GROUP BY club_id, link_hash_b
        )
    WHERE length(clt_b) >= 2
)
USING club_id
GROUP BY club_id, tot_clt_arr;

Возвращает массив client_id, а также номер уникального client_id в столбце tot_clt.

Спасибо @ TomášZáluský за вашу помощь.

...