Практика 'Синтаксис' - Clickhouse
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
-- Задание 1
|
||||
CREATE TABLE mnoskov.users
|
||||
ON CLUSTER clickhouse_cluster
|
||||
(
|
||||
user_id UInt32,
|
||||
name String,
|
||||
age UInt8,
|
||||
country String,
|
||||
is_active UInt8
|
||||
)
|
||||
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()
|
||||
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 пункт.
|
||||
|
||||
-- Ответ на вопрос - ну да - поддерживает.
|
||||
Reference in New Issue
Block a user