我有以下数据:
-----------------------------------------
| client_id | link_hash_a | link_hash_b |
-----------------------------------------
| 1 | abc | xyz |
| 2 | def | xyz |
| 3 | def | uvw |
-----------------------------------------
我想创建一个client_id数组,这些数组使用SQL与来自列link_hash_a
和link_hash_b
的两个哈希值链接。
在当前情况下,结果将是值为{1,2,3}
的唯一数组,因为客户端1和2与xyz
列的值link_hash_b
链接,并且客户端2和3与def
列的值link_hash_a
关联。
是否可以使用SQL查询来做到这一点?非常感谢您的投入。
答案 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] │
└────────────┘
*/