sql—基于其他两列的值创建数组

deikduxw  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(2)|浏览(260)

我有以下数据:

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

我想创建一个client\u id数组,它与列中的两个散列值相链接 link_hash_a 以及 link_hash_b 使用sql。
在当前情况下,结果将是一个具有 {1,2,3} 因为客户机1和客户机2与值链接 xyzlink_hash_b 列以及客户机2和3与值链接 deflink_hash_a 列。
有没有一种方法可以通过sql查询实现这一点?非常感谢你的意见。

gijlo24d

gijlo24d1#

另一种方法是:

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

* /
fhg3lkii

fhg3lkii2#

我想我找到了办法。我用了另一个列 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_idtot_clt 列。
谢谢你@汤姆ášzá卢斯克ý 谢谢你的帮助。

相关问题