Задание 3
This commit is contained in:
@@ -57,3 +57,35 @@ FROM (
|
|||||||
)
|
)
|
||||||
WHERE DateTime_Valid IS NOT NULL;
|
WHERE DateTime_Valid IS NOT NULL;
|
||||||
|
|
||||||
|
--Задача 3
|
||||||
|
DROP TABLE IF EXISTS user_activity ON CLUSTER clickhouse_cluster;
|
||||||
|
|
||||||
|
CREATE TABLE user_activity
|
||||||
|
ON CLUSTER clickhouse_cluster
|
||||||
|
(
|
||||||
|
user_id UInt32,
|
||||||
|
actions String -- JSON: ["login", "purchase", "logout"]
|
||||||
|
) ENGINE = MergeTree ORDER BY tuple();
|
||||||
|
|
||||||
|
--Тест данные
|
||||||
|
INSERT INTO user_activity (user_id, actions) VALUES
|
||||||
|
(1, '["login", "purchase", "logout"]'),
|
||||||
|
(2, '["login", "logout"]'),
|
||||||
|
(3, '["login"]'),
|
||||||
|
(4, '["login","purchase"]');
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
user_id,
|
||||||
|
-- Сначала реобразовал записи из набора "каких-то" букв (String) в массив строк Array(String). Потом считваем длину массива и дальше суммируем длину всех массивов действий для каждого пользователя
|
||||||
|
sum(length(JSONExtract(actions, 'Array(String)'))) AS count_actions
|
||||||
|
FROM user_activity
|
||||||
|
WHERE
|
||||||
|
-- Проверяем наличие 'purchase' в массиве
|
||||||
|
has(JSONExtract(actions, 'Array(String)'), 'purchase')
|
||||||
|
GROUP BY
|
||||||
|
user_id;
|
||||||
|
/*
|
||||||
|
Преобразовал записи из набора "каких-то" букв (String) в массив строк Array(String). Нашел пользователей в новом массиве Array(String), совершивших действие "purchase".
|
||||||
|
Просто написать actions = 'purchase' не получится, так как изначально actions просто (String) и соответсвенно "["login", "purchase", "logout"]" нельзя сравнить с "purchase". Поэтому сначала преобразовываем в массив, а потом с функцией has(array, elem) ищем то, что нужно.
|
||||||
|
То есть менять бы не пришлось, если бы в actions было изначально разные значения в каждой строке ("login", "purchase" или "logout")
|
||||||
|
*/
|
||||||
Reference in New Issue
Block a user