Работа над ошибками: 'Синтаксис'.

Практика: 'JOIN' - 'Массивы, Map и вложенные структуры*' - 'Партиции' - 'Индексы'.
This commit is contained in:
mnoskov
2026-05-18 16:55:22 +03:00
parent 80d333fe52
commit ae208a76fb
8 changed files with 577 additions and 0 deletions
@@ -0,0 +1,120 @@
-- Задание 1
CREATE TABLE mnoskov.page_views
ON CLUSTER clickhouse_cluster
(
user_id UInt64,
url String,
view_time DateTime
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(view_time)
ORDER BY (user_id, view_time);
-- Задание 2
CREATE TABLE mnoskov.users
ON CLUSTER clickhouse_cluster
(
id UInt64,
name String,
update_at DateTime
)
ENGINE = ReplacingMergeTree(update_at)
ORDER BY id;
-- Задание 3
CREATE TABLE mnoskov.region_sales
ON CLUSTER clickhouse_cluster
(
region String,
date Date,
sales UInt64
)
ENGINE = SummingMergeTree
PARTITION BY toYYYYMM(date)
ORDER BY (region, date);
INSERT INTO mnoskov.region_sales (region, date, sales)
VALUES
('Moscow', '2026-05-01', 100),
('Moscow', '2026-05-01', 150),
('Moscow', '2026-05-01', 200),
('Berlin', '2026-05-02', 300),
('Berlin', '2026-05-02', 120),
('Berlin', '2026-05-02', 80),
('Paris', '2026-05-03', 500),
('Paris', '2026-05-03', 250),
('London', '2026-05-04', 400),
('Tokyo', '2026-05-05', 700);
SELECT * FROM mnoskov.region_sales;
-- Все четко работает.
-- Задание 4
CREATE TABLE mnoskov.user_metrics
ON CLUSTER clickhouse_cluster
(
region String,
avg_age_state AggregateFunction(avg, UInt8),
active_users_state AggregateFunction(uniq, UInt64)
)
ENGINE = AggregatingMergeTree
ORDER BY region;
CREATE TABLE mnoskov.user_metrics_source
ON CLUSTER clickhouse_cluster
(
region String,
age UInt8,
user_id UInt64
)
ENGINE = MergeTree
ORDER BY region;
INSERT INTO mnoskov.user_metrics_source
(region, age, user_id)
VALUES
('Moscow', 25, 1001),
('Moscow', 30, 1002),
('Moscow', 22, 1003),
('Moscow', 25, 1001),
('Berlin', 40, 2001),
('Berlin', 35, 2002),
('Berlin', 29, 2003),
('Berlin', 35, 2002),
('Paris', 31, 3001),
('Paris', 28, 3002),
('Paris', 45, 3003),
('Paris', 31, 3001),
('London', 50, 4001),
('London', 41, 4002),
('London', 38, 4003),
('London', 41, 4002),
('Tokyo', 27, 5001),
('Tokyo', 33, 5002),
('Tokyo', 29, 5003),
('Tokyo', 33, 5002);
SELECT * FROM mnoskov.user_metrics_source;
INSERT INTO mnoskov.user_metrics
SELECT
region,
avgState(age) AS avg_age_state,
uniqState(user_id) AS active_users_state
FROM
mnoskov.user_metrics_source
GROUP BY
region;
SELECT
region,
avgMerge(avg_age_state),
uniqMerge(active_users_state)
FROM
mnoskov.user_metrics
GROUP BY
region;
-- Че то кликхаус странно себя ведет, то таблицы сами очищаются, то удаленные таблицы воскресают.
@@ -0,0 +1,86 @@
-- Задание 1
CREATE TABLE mnoskov.logs
ON CLUSTER clickhouse_cluster (
dt DateTime,
user_id UInt32,
event_type String
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/logs',
'{replica}'
)
ORDER BY dt;
CREATE TABLE mnoskov.dist_logs
ON CLUSTER clickhouse_cluster
ENGINE = Distributed(
'clickhouse_cluster',
'mnoskov',
'logs',
user_id
);
-- параметр rand() - это ключ распределния между шардами. Если стоит он, то распределяются данные случайно, если укащать колонку, то по колонке.
-- Задание 2
CREATE TABLE mnoskov.events
ON CLUSTER clickhouse_cluster
(
user_id UInt32,
event_type String,
ts DateTime
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/events',
'{replica}'
)
ORDER BY (ts, user_id);
CREATE VIEW mnoskov.top_active_users AS
SELECT
user_id,
count(*) AS cnt_user
FROM
mnoskov.events
GROUP BY
user_id
ORDER BY
cnt_user DESC, user_id
LIMIT 100;
-- VIEW не подойдет, тк вьюшка будет каждый раз считаться заново, а это энергозатратно, поэтому надо использовать MATERIALIZED VIEW.
-- Задание 3
CREATE TABLE mnoskov.raw_events
ON CLUSTER clickhouse_cluster
(
event_time DateTime,
user_id UInt32,
event_type String
)
ENGINE=MergeTree
ORDER BY(event_time,user_id);
CREATE TABLE mnoskov.agr_clicks_per_day
ON CLUSTER clickhouse_cluster
(
event_date Date,
count UInt64
)
ENGINE=SummingMergeTree
ORDER BY event_date;
CREATE MATERIALIZED VIEW mnoskov.mv_clicks_per_day
ON CLUSTER clickhouse_cluster
TO mnoskov.agr_clicks_per_day AS
SELECT
toDate(event_time) AS event_date,
count(*) AS count
FROM mnoskov.raw_events
GROUP BY event_date;
SELECT * FROM mnoskov.raw_events;
SELECT * FROM mnoskov.agr_clicks_per_day;
@@ -0,0 +1,115 @@
-- Задание 1
CREATE TABLE mnoskov.raw_data1
ON CLUSTER clickhouse_cluster (
user_id String,
balance String,
created_at String
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/raw_data1',
'{replica}'
)
ORDER BY tuple();
SELECT
user_id,
balance,
created_at
FROM (
SELECT
user_id,
toDecimal64OrNull(balance,2) AS balance,
toDateTime64OrNull(created_at, 3) AS created_at
FROM
mnoskov.raw_data1
)
WHERE
balance IS NOT NULL AND created_at IS NOT NULL;
-- Задание 2
CREATE TABLE mnoskov.events
ON CLUSTER clickhouse_cluster (
event_id String,
event_date String, -- форматы: "2023-01-01", "01.02.2023", "invalid"
event_time String -- форматы: "12:30:45", "25:99:99"
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/events',
'{replica}'
)
ORDER BY
event_id;
SELECT * FROM mnoskov.events;
SELECT
event_id,
event_datetime
FROM (
SELECT
event_id,
parseDateTimeBestEffortOrNull(concat(event_date, ' ', event_time)) AS event_datetime
FROM
mnoskov.events
)
ORDER BY
event_datetime;
-- Задание 3
CREATE TABLE mnoskov.user_activity
ON CLUSTER clickhouse_cluster
(
user_id UInt32,
actions String -- JSON: ["login", "purchase", "logout"]
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/user_activity',
'{replica}'
)
ORDER BY
user_id;
SELECT
user_id,
count(*) as user_actions_cnt
FROM
mnoskov.user_activity
WHERE
has(JSONExtract(actions, 'Array(String)'), 'purchase')
GROUP BY
user_id
ORDER BY
user_id;
-- Задание 4
CREATE TABLE mnoskov.sensor_data
ON CLUSTER clickhouse_cluster
(
sensor_id UInt32,
value Float64,
status Enum('ok' = 1, 'error' = 2)
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/sensor_data',
'{replica}'
)
ORDER BY sensor_id;
--1-2.
SELECT
toString(status) AS str_status,
avg(value) AS avg_value
FROM
mnoskov.sensor_data
GROUP BY
str_status;
--3
-- не понял задание. все строки в value можно преобразовать в Decimal(10,2), потому что value - Float64, а он все null переделывает в 0.