SQL-根据其他两列的值创建一个数组

时间:2020-03-24 07:32:43

标签: sql arrays clickhouse

我有以下数据:

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

我想创建一个client_id数组,这些数组使用SQL与来自列link_hash_alink_hash_b的两个哈希值链接。

在当前情况下,结果将是值为{1,2,3}的唯一数组,因为客户端1和2与xyz列的值link_hash_b链接,并且客户端2和3与def列的值link_hash_a关联。

是否可以使用SQL查询来做到这一点?非常感谢您的投入。

2 个答案:

答案 0 :(得分:0)

我想我找到了一条路。我使用了另一列,即客户所属的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ý的帮助。

答案 1 :(得分:0)

可以用这种方式替代:

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]    │
└────────────┘
*/