Files
homework/mnoskov/clickhouse/Практика clickhouse/2. Запросы/1. Синтаксис/practice_syntax.sql
T
mnoskov ae208a76fb Работа над ошибками: 'Синтаксис'.
Практика: 'JOIN' - 'Массивы, Map и вложенные структуры*' - 'Партиции' - 'Индексы'.
2026-05-18 16:55:22 +03:00

215 lines
4.0 KiB
SQL

-- Задание 1
CREATE TABLE mnoskov.users
ON CLUSTER clickhouse_cluster
(
user_id UInt32,
name String,
age UInt8,
country String,
is_active Bool
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/users',
'{replica}'
)
ORDER BY user_id;
INSERT INTO mnoskov.users
(user_id,name,age,country,is_active)
VALUES
(1,'Ivan',30,'RU',1),
(2,'Anna',25,'RU',1),
(3,'Petr',45,'RU',0),
(4,'Olga',35,'RU',1),
(5,'John',55,'US',1),
(6,'Alice',42,'US',0),
(7,'Tom',38,'US',1),
(8,'Lucas',28,'BR',1),
(9,'Maria',60,'BR',1),
(10,'Joao',27,'BR',0),
(11,'Kenji',33,'JP',1),
(12,'Yuki',29,'JP',0),
(13,'Chen',40,'CN',1),
(14,'Li',48,'CN',1),
(15,'Fatima',31,'AE',1),
(16,'Ahmed',36,'AE',1),
(17,'George',24,'US',1),
(18,'Nina',34,'RU',1),
(19,'Max',50,'DE',1),
(20,'Sophie',22,'DE',0);
SELECT * FROM mnoskov.users;
--1
SELECT
user_id,
age,
is_active
FROM
mnoskov.users
WHERE
is_active = TRUE
ORDER BY
age DESC
LIMIT 10;
--2
SELECT
name,
country
FROM
mnoskov.users
WHERE
country = 'RU'
ORDER BY
name;
--3
SELECT
user_id,
age,
is_active
FROM
mnoskov.users
WHERE
is_active = TRUE
LIMIT 10;
-- Данные вывелить так как лежат на диске.
--4
SELECT
country,
count() as cnt_users
FROM
mnoskov.users
GROUP BY
country;
--5
SELECT
country,
min(age) AS min_age,
max(age) AS max_age
FROM
mnoskov.users
GROUP BY
country;
--6
SELECT
country,
count() AS cnt_users
FROM
mnoskov.users
GROUP BY
country
ORDER BY
cnt_users DESC;
--Доп
SELECT
uniqExact(country),
uniq(country)
FROM
mnoskov.users;
-- uniqExact(country) - кол-во уникальных значений в колонке country. Но uniq работает также.
-- В инете написано что uniq быстрее.
-- Задание 2
CREATE TABLE mnoskov.events1
ON CLUSTER clickhouse_cluster
(
user_id UInt32,
event_time DateTime,
event_type String
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/events1',
'{replica}'
)
ORDER BY(user_id,event_time);
INSERT INTO mnoskov.events1
(user_id,event_time,event_type)
VALUES
(1,'2025-07-17 09:00:00','click'),
(1,'2025-07-17 09:05:00','view'),
(1,'2025-07-17 09:10:00','purchase'),
(2,'2025-07-17 10:00:00','click'),
(2,'2025-07-17 10:05:00','click'),
(2,'2025-07-17 11:00:00','view'),
(3,'2025-07-16 12:00:00','view'),
(3,'2025-07-16 12:30:00','click'),
(3,'2025-07-17 08:00:00','purchase'),
(4,'2025-07-17 13:00:00','click'),
(4,'2025-07-17 14:00:00','view'),
(4,'2025-07-17 15:00:00','view'),
(5,'2025-07-16 20:00:00','view'),
(5,'2025-07-17 01:00:00','click'),
(5,'2025-07-17 06:00:00','purchase'),
(6,'2025-07-17 07:30:00','view'),
(6,'2025-07-17 08:45:00','click'),
(7,'2025-07-16 23:59:59','click'),
(7,'2025-07-17 00:01:00','purchase'),
(7,'2025-07-17 10:10:00','view');
SELECT * FROM mnoskov.events1;
--1
SELECT
user_id,
event_time,
event_type,
count() OVER(PARTITION BY user_id ORDER BY event_time) AS com_users
FROM
mnoskov.events1;
--2
SELECT
user_id,
event_time,
event_type,
row_number() OVER (PARTITION BY user_id ORDER BY event_time) rn,
dense_rank() OVER (PARTITION BY user_id ORDER BY event_time) dr,
count() OVER(PARTITION BY user_id ORDER BY event_time) AS c,
sum(1) OVER(PARTITION BY user_id ORDER BY event_time) AS s
FROM
mnoskov.events1;
--3
SELECT
user_id,
event_time,
event_type,
count() OVER(PARTITION BY user_id ORDER BY event_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS com_users,
count() OVER(PARTITION BY user_id ORDER BY event_time ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS com_users2
FROM
mnoskov.events1;
-- все четенько работает, никаких ошибкок нет
--4-5-6
WITH recent_events AS (
SELECT
user_id,
event_time,
event_type
FROM
mnoskov.events1
WHERE
event_time < now() - INTERVAL 1 DAY
)
SELECT
user_id,
count(*) AS cnt_user_actions
FROM
recent_events
GROUP BY
user_id
ORDER BY
cnt_user_actions DESC
LIMIT
5;
-- не понял, как сделать 6 пункт.
-- Ответ на вопрос - ну да - поддерживает.