property1 String,
custom_properties Nested(k String, v String)
) Engine=MergeTree ORDER BY (user_id);
Достать кастомные поля я могу таким способом:
SELECT
user_id,
property1,
custom_properties.v[indexOf(custom_properties.k, 'color')],
custom_properties.v[indexOf(custom_properties.k, 'size')],
FROM test.nested
Выносим кастомные поля в отдельную табличку, чтобы легко можно было их обновлять:
CREATE TABLE user_properties (
user_id UInt64,
k String,
v String
) Engine=ReplacingMergeTree ORDER BY (user_id, k);
Написал такой запрос:
SELECT user_id, property1, vals[indexOf(keys, 'color')], vals[indexOf(keys, 'size')]
FROM users
JOIN (
SELECT user_id, groupArray(k) as keys, groupArray(v) as vals
FROM user_properties
GROUP BY user_id
) using (user_id)
всё вроде ок, одна проблема, что в документации написано:
"groupArray добавляет значения в любом (недетерминированном) порядке"
Есть какие-то детерминированные варианты?
В некоторых случаях, вы всё же можете рассчитывать на порядок выполнения запроса. Это — случаи, когда SELECT идёт из подзапроса, в котором используется ORDER BY.
SELECT user_id, property1, vals[indexOf(keys, 'color')], vals[indexOf(keys, 'size')] FROM users JOIN ( SELECT user_id, groupArray(k) as keys, groupArray(v) as vals FROM (SELECT user_id, k, v FROM user_properties order by user_id, k) GROUP BY user_id ) using (user_id)
Обсуждают сегодня