Как использовать jsonb_build_object() в Clickhouse?

У меня есть этот запрос в 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'}]                                  | []

https://www.db-fiddle.com/f/42X7Dw3k2RbUe2MoJxmQET/6

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я позволю вам разобраться с остальными тегами, но это должно ответить на вопрос, 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

Другие вопросы по теме