У меня есть этот запрос в postgresql:
select t.id, t.hash,
array_agg (distinct jsonb_strip_nulls(jsonb_build_object('field1', l.field1, 'value', l."value"))) logs_array,
array_agg (distinct jsonb_strip_nulls(jsonb_build_object('tag1', tg.tag1, 'value', tg."value"))) tags_array
from transactions t
left join logs l on t.id = l.transaction_id
left join tags tg on t.id = tg.transaction_id
where l.field1 = 'f1' and tg.tag1 = 't1'
group by t.id, t.hash
order by t.id;
как его конвертировать в кликхаус? array_aggНаверное, это groupArray. А как насчет jsonb_build_object?
Пример:
transactions
id int
hash var
id | hash
------------
1 | h1
2 | h2
3 | h3
logs
transaction_id int
field1 var
value var
transaction_id | field1 | value
-------------------------------
1 | f1 | v1
1 | f2 | v2
2 | f3 | v3
3 | f4 | v4
tags
transaction_id int
tag1 var
value var
transaction_id | tag1 | value
-------------------------------
1 | t1 | v1
2 | t2 | v2
2 | t3 | v3
Мне нужен результат:
id | hash | logs_array | tags_array
------------------------------------------------------------------------------------------
1 | h1 | [{'field1': 'f1', 'value': 'v1'}, {'field1': 'f2', 'value': 'v2'}] | [{'tag1': 't1', 'value': 'v1'}]
2 | h2 | [{'field1': 'f3', 'value': 'v3'}] | [{'tag1': 't2', 'value': 'v2'}, {'tag1': 't3', 'value': 'v3'}]
3 | h3 | [{'field1': 'f4', 'value': 'v4'}] | []


Я позволю вам разобраться с остальными тегами, но это должно ответить на вопрос, groupArray и toJSONString. Вам нужно выполнить приведение к именованным кортежам.
CREATE TABLE transactions
(
`Id` Int32,
`hash` String
)
ENGINE = Memory
CREATE TABLE logs
(
`transaction_id` Int32,
`field1` String,
`value` String
)
ENGINE = Memory
INSERT INTO transactions VALUES (1, 'h1'), (2, 'h2'), (3, 'h3')
INSERT INTO logs VALUES (1, 'f1', 'v1'), (1, 'f2', 'v2'), (2, 'f3', 'v3'), (3, 'f4', 'v4')
SELECT
Id,
any(hash) AS hash,
toJSONString(groupArray((field1, value)::'Tuple(field1 String, value String)')) AS logs_array
FROM transactions AS t
LEFT JOIN logs AS l ON t.Id = l.transaction_id
GROUP BY Id
Query id: 34c5e09d-1411-497b-903b-13a6ff76f10b
┌─Id─┬─hash─┬─logs_array──────────────────────────────────────────────────┐
1. │ 3 │ h3 │ [{"field1":"f4","value":"v4"}] │
2. │ 2 │ h2 │ [{"field1":"f3","value":"v3"}] │
3. │ 1 │ h1 │ [{"field1":"f1","value":"v1"},{"field1":"f2","value":"v2"}] │
└────┴──────┴─────────────────────────────────────────────────────────────┘
3 rows in set. Elapsed: 0.002 sec.
Вот еще один способ сделать это, используя toJSONString, groupArray и map:
SELECT t.id,
toJSONString(groupArray(distinct map('field1', field1, 'value', l.val))) as logs_array,
toJSONString(groupArray(distinct map('tag1', tag1, 'value', tg.val))) as tags_array
FROM transactions AS t
LEFT JOIN logs AS l ON t.id = l.transaction_id
LEFT JOIN tags tg on t.id = tg.transaction_id
GROUP BY t.id