убрал : из папок

This commit is contained in:
mnoskov
2026-05-28 18:00:56 +03:00
parent e0b74cdc13
commit f045be8a39
30 changed files with 0 additions and 0 deletions
@@ -0,0 +1,6 @@
"course_id","title","category","created_at"
1,SQL для начинающих,data,2023-01-01 00:00:00.000
5,Основы машинного обучения,data,2023-03-15 00:00:00.000
2,Python для анализа данных,programming,2023-01-15 00:00:00.000
3,BI с нуля,business,2023-03-01 00:00:00.000
4,Excel для аналитиков,business,2023-02-01 00:00:00.000
1 course_id title category created_at
2 1 SQL для начинающих data 2023-01-01 00:00:00.000
3 5 Основы машинного обучения data 2023-03-15 00:00:00.000
4 2 Python для анализа данных programming 2023-01-15 00:00:00.000
5 3 BI с нуля business 2023-03-01 00:00:00.000
6 4 Excel для аналитиков business 2023-02-01 00:00:00.000
@@ -0,0 +1,19 @@
"lesson_id","title","duration_min","course_id"
2,JOIN,15,1
3,WHERE и фильтрация,12,1
4,Агрегации и GROUP BY,18,1
6,Pandas основы,20,2
7,NumPy,15,2
8,Визуализация данных,22,2
9,Основы BI,12,3
10,Метрики и дашборды,18,3
13,Сводные таблицы,18,4
16,Линейная регрессия,30,5
18,Кластеризация,25,5
1,SELECT и FROM,10,1
5,Подзапросы,25,1
11,Power BI введение,20,3
12,Формулы в Excel,15,4
14,Графики и диаграммы,14,4
15,Введение в ML,20,5
17,Классификация,28,5
1 lesson_id title duration_min course_id
2 2 JOIN 15 1
3 3 WHERE и фильтрация 12 1
4 4 Агрегации и GROUP BY 18 1
5 6 Pandas основы 20 2
6 7 NumPy 15 2
7 8 Визуализация данных 22 2
8 9 Основы BI 12 3
9 10 Метрики и дашборды 18 3
10 13 Сводные таблицы 18 4
11 16 Линейная регрессия 30 5
12 18 Кластеризация 25 5
13 1 SELECT и FROM 10 1
14 5 Подзапросы 25 1
15 11 Power BI введение 20 3
16 12 Формулы в Excel 15 4
17 14 Графики и диаграммы 14 4
18 15 Введение в ML 20 5
19 17 Классификация 28 5
@@ -0,0 +1,21 @@
"user_id","name","age","email","registration_date"
2,Bob,30,bob@gmail.com,2023-02-05 00:00:00.000
3,Charlie,22,charlie@mail.com,2023-02-20 00:00:00.000
4,Diana,28,diana@mail.com,2023-03-01 00:00:00.000
6,Frank,29,frank@mail.com,2023-01-05 00:00:00.000
7,Grace,26,grace@gmail.com,2023-01-12 00:00:00.000
8,Henry,32,henry@mail.com,2023-01-20 00:00:00.000
9,Iris,24,iris@gmail.com,2023-02-10 00:00:00.000
10,Jack,27,jack@mail.com,2023-04-15 00:00:00.000
13,Mia,26,mia@gmail.com,2023-01-18 00:00:00.000
16,Paul,29,paul@mail.com,2023-02-15 00:00:00.000
18,Rita,27,rita@mail.com,2023-04-01 00:00:00.000
19,Sam,30,sam@gmail.com,2023-04-10 00:00:00.000
1,Alice,25,alice@mail.com,2023-01-10 00:00:00.000
5,Ethan,35,ethan@gmail.com,2023-03-10 00:00:00.000
11,Kelly,23,kelly@gmail.com,2023-04-20 00:00:00.000
12,Leo,31,leo@mail.com,2023-01-15 00:00:00.000
14,Nina,28,nina@mail.com,2023-01-08 00:00:00.000
15,Oscar,33,oscar@gmail.com,2023-01-10 00:00:00.000
17,Quinn,24,quinn@gmail.com,2023-03-20 00:00:00.000
20,Tina,25,tina@mail.com,2023-04-18 00:00:00.000
1 user_id name age email registration_date
2 2 Bob 30 bob@gmail.com 2023-02-05 00:00:00.000
3 3 Charlie 22 charlie@mail.com 2023-02-20 00:00:00.000
4 4 Diana 28 diana@mail.com 2023-03-01 00:00:00.000
5 6 Frank 29 frank@mail.com 2023-01-05 00:00:00.000
6 7 Grace 26 grace@gmail.com 2023-01-12 00:00:00.000
7 8 Henry 32 henry@mail.com 2023-01-20 00:00:00.000
8 9 Iris 24 iris@gmail.com 2023-02-10 00:00:00.000
9 10 Jack 27 jack@mail.com 2023-04-15 00:00:00.000
10 13 Mia 26 mia@gmail.com 2023-01-18 00:00:00.000
11 16 Paul 29 paul@mail.com 2023-02-15 00:00:00.000
12 18 Rita 27 rita@mail.com 2023-04-01 00:00:00.000
13 19 Sam 30 sam@gmail.com 2023-04-10 00:00:00.000
14 1 Alice 25 alice@mail.com 2023-01-10 00:00:00.000
15 5 Ethan 35 ethan@gmail.com 2023-03-10 00:00:00.000
16 11 Kelly 23 kelly@gmail.com 2023-04-20 00:00:00.000
17 12 Leo 31 leo@mail.com 2023-01-15 00:00:00.000
18 14 Nina 28 nina@mail.com 2023-01-08 00:00:00.000
19 15 Oscar 33 oscar@gmail.com 2023-01-10 00:00:00.000
20 17 Quinn 24 quinn@gmail.com 2023-03-20 00:00:00.000
21 20 Tina 25 tina@mail.com 2023-04-18 00:00:00.000
@@ -0,0 +1,46 @@
"user_id","enrolled_at","course_id"
2,2023-01-20 00:00:00.000,1
3,2023-03-05 00:00:00.000,2
6,2023-01-06 00:00:00.000,1
6,2023-01-10 00:00:00.000,2
6,2023-02-05 00:00:00.000,4
7,2023-01-13 00:00:00.000,1
7,2023-03-10 00:00:00.000,3
8,2023-01-22 00:00:00.000,3
13,2023-01-19 00:00:00.000,2
13,2023-02-20 00:00:00.000,4
16,2023-02-16 00:00:00.000,2
16,2023-02-16 00:00:00.000,4
19,2023-04-11 00:00:00.000,1
19,2023-04-11 00:00:00.000,2
2,2023-03-15 00:00:00.000,3
4,2023-03-10 00:00:00.000,2
7,2023-02-01 00:00:00.000,2
9,2023-02-15 00:00:00.000,1
18,2023-04-05 00:00:00.000,4
4,2023-04-01 00:00:00.000,3
8,2023-01-22 00:00:00.000,1
8,2023-01-22 00:00:00.000,2
9,2023-02-12 00:00:00.000,4
10,2023-04-16 00:00:00.000,1
18,2023-04-02 00:00:00.000,1
3,2023-02-25 00:00:00.000,1
6,2023-03-08 00:00:00.000,3
1,2023-02-01 00:00:00.000,2
11,2023-04-21 00:00:00.000,2
14,2023-01-09 00:00:00.000,2
14,2023-01-09 00:00:00.000,3
14,2023-03-20 00:00:00.000,5
17,2023-03-22 00:00:00.000,3
20,2023-04-19 00:00:00.000,2
12,2023-03-10 00:00:00.000,3
1,2023-01-15 00:00:00.000,1
12,2023-01-16 00:00:00.000,1
14,2023-01-09 00:00:00.000,1
14,2023-02-01 00:00:00.000,4
15,2023-01-11 00:00:00.000,1
15,2023-03-05 00:00:00.000,3
17,2023-03-25 00:00:00.000,5
5,2023-03-20 00:00:00.000,5
1,2023-02-10 00:00:00.000,4
15,2023-02-01 00:00:00.000,2
1 user_id enrolled_at course_id
2 2 2023-01-20 00:00:00.000 1
3 3 2023-03-05 00:00:00.000 2
4 6 2023-01-06 00:00:00.000 1
5 6 2023-01-10 00:00:00.000 2
6 6 2023-02-05 00:00:00.000 4
7 7 2023-01-13 00:00:00.000 1
8 7 2023-03-10 00:00:00.000 3
9 8 2023-01-22 00:00:00.000 3
10 13 2023-01-19 00:00:00.000 2
11 13 2023-02-20 00:00:00.000 4
12 16 2023-02-16 00:00:00.000 2
13 16 2023-02-16 00:00:00.000 4
14 19 2023-04-11 00:00:00.000 1
15 19 2023-04-11 00:00:00.000 2
16 2 2023-03-15 00:00:00.000 3
17 4 2023-03-10 00:00:00.000 2
18 7 2023-02-01 00:00:00.000 2
19 9 2023-02-15 00:00:00.000 1
20 18 2023-04-05 00:00:00.000 4
21 4 2023-04-01 00:00:00.000 3
22 8 2023-01-22 00:00:00.000 1
23 8 2023-01-22 00:00:00.000 2
24 9 2023-02-12 00:00:00.000 4
25 10 2023-04-16 00:00:00.000 1
26 18 2023-04-02 00:00:00.000 1
27 3 2023-02-25 00:00:00.000 1
28 6 2023-03-08 00:00:00.000 3
29 1 2023-02-01 00:00:00.000 2
30 11 2023-04-21 00:00:00.000 2
31 14 2023-01-09 00:00:00.000 2
32 14 2023-01-09 00:00:00.000 3
33 14 2023-03-20 00:00:00.000 5
34 17 2023-03-22 00:00:00.000 3
35 20 2023-04-19 00:00:00.000 2
36 12 2023-03-10 00:00:00.000 3
37 1 2023-01-15 00:00:00.000 1
38 12 2023-01-16 00:00:00.000 1
39 14 2023-01-09 00:00:00.000 1
40 14 2023-02-01 00:00:00.000 4
41 15 2023-01-11 00:00:00.000 1
42 15 2023-03-05 00:00:00.000 3
43 17 2023-03-25 00:00:00.000 5
44 5 2023-03-20 00:00:00.000 5
45 1 2023-02-10 00:00:00.000 4
46 15 2023-02-01 00:00:00.000 2
@@ -0,0 +1,59 @@
"user_id","lesson_id","course_id","viewed_at"
3,6,2,2023-03-06 12:00:00.000
4,9,3,2023-04-02 10:00:00.000
4,6,2,2023-03-12 14:00:00.000
4,7,2,2023-03-13 09:00:00.000
6,3,1,2023-01-08 09:00:00.000
6,6,2,2023-01-11 14:00:00.000
6,7,2,2023-01-12 10:00:00.000
6,8,2,2023-01-13 11:00:00.000
6,9,3,2023-03-09 11:00:00.000
7,9,3,2023-03-11 14:00:00.000
2,9,3,2023-03-16 10:00:00.000
2,10,3,2023-03-16 10:30:00.000
3,2,1,2023-02-26 11:20:00.000
4,10,3,2023-04-03 10:00:00.000
6,2,1,2023-01-07 10:15:00.000
6,4,1,2023-01-08 09:30:00.000
6,13,4,2023-02-06 09:30:00.000
7,2,1,2023-01-14 10:20:00.000
7,3,1,2023-01-15 09:00:00.000
7,10,3,2023-03-11 14:30:00.000
9,13,4,2023-02-13 10:30:00.000
13,6,2,2023-01-20 14:00:00.000
13,7,2,2023-01-21 10:00:00.000
2,1,1,2023-01-21 09:00:00.000
6,1,1,2023-01-07 10:00:00.000
6,14,4,2023-02-07 10:00:00.000
7,1,1,2023-01-14 10:00:00.000
9,12,4,2023-02-13 10:00:00.000
9,1,1,2023-02-16 11:00:00.000
3,1,1,2023-02-26 11:00:00.000
6,5,1,2023-01-09 10:00:00.000
6,12,4,2023-02-06 09:00:00.000
13,12,4,2023-02-21 09:00:00.000
1,2,1,2023-01-16 10:15:00.000
1,3,1,2023-01-17 09:00:00.000
1,4,1,2023-01-17 09:30:00.000
1,4,1,2023-01-18 10:00:00.000
1,6,2,2023-02-02 14:00:00.000
1,13,4,2023-02-15 10:30:00.000
5,16,5,2023-03-22 11:00:00.000
12,2,1,2023-01-17 10:20:00.000
12,3,1,2023-04-10 11:30:00.000
14,2,1,2023-01-09 08:15:00.000
14,4,1,2023-01-10 10:30:00.000
14,6,2,2023-01-10 14:00:00.000
14,9,3,2023-01-10 08:00:00.000
1,4,1,2023-01-17 11:00:00.000
12,9,3,2023-03-12 10:00:00.000
14,3,1,2023-01-10 10:00:00.000
14,7,2,2023-01-11 10:00:00.000
14,8,2,2023-01-12 11:00:00.000
1,12,4,2023-02-15 10:00:00.000
12,1,1,2023-01-17 10:00:00.000
14,5,1,2023-01-11 09:00:00.000
1,1,1,2023-01-16 10:00:00.000
5,15,5,2023-03-21 10:00:00.000
12,1,1,2023-04-10 11:00:00.000
14,1,1,2023-01-09 08:00:00.000
1 user_id lesson_id course_id viewed_at
2 3 6 2 2023-03-06 12:00:00.000
3 4 9 3 2023-04-02 10:00:00.000
4 4 6 2 2023-03-12 14:00:00.000
5 4 7 2 2023-03-13 09:00:00.000
6 6 3 1 2023-01-08 09:00:00.000
7 6 6 2 2023-01-11 14:00:00.000
8 6 7 2 2023-01-12 10:00:00.000
9 6 8 2 2023-01-13 11:00:00.000
10 6 9 3 2023-03-09 11:00:00.000
11 7 9 3 2023-03-11 14:00:00.000
12 2 9 3 2023-03-16 10:00:00.000
13 2 10 3 2023-03-16 10:30:00.000
14 3 2 1 2023-02-26 11:20:00.000
15 4 10 3 2023-04-03 10:00:00.000
16 6 2 1 2023-01-07 10:15:00.000
17 6 4 1 2023-01-08 09:30:00.000
18 6 13 4 2023-02-06 09:30:00.000
19 7 2 1 2023-01-14 10:20:00.000
20 7 3 1 2023-01-15 09:00:00.000
21 7 10 3 2023-03-11 14:30:00.000
22 9 13 4 2023-02-13 10:30:00.000
23 13 6 2 2023-01-20 14:00:00.000
24 13 7 2 2023-01-21 10:00:00.000
25 2 1 1 2023-01-21 09:00:00.000
26 6 1 1 2023-01-07 10:00:00.000
27 6 14 4 2023-02-07 10:00:00.000
28 7 1 1 2023-01-14 10:00:00.000
29 9 12 4 2023-02-13 10:00:00.000
30 9 1 1 2023-02-16 11:00:00.000
31 3 1 1 2023-02-26 11:00:00.000
32 6 5 1 2023-01-09 10:00:00.000
33 6 12 4 2023-02-06 09:00:00.000
34 13 12 4 2023-02-21 09:00:00.000
35 1 2 1 2023-01-16 10:15:00.000
36 1 3 1 2023-01-17 09:00:00.000
37 1 4 1 2023-01-17 09:30:00.000
38 1 4 1 2023-01-18 10:00:00.000
39 1 6 2 2023-02-02 14:00:00.000
40 1 13 4 2023-02-15 10:30:00.000
41 5 16 5 2023-03-22 11:00:00.000
42 12 2 1 2023-01-17 10:20:00.000
43 12 3 1 2023-04-10 11:30:00.000
44 14 2 1 2023-01-09 08:15:00.000
45 14 4 1 2023-01-10 10:30:00.000
46 14 6 2 2023-01-10 14:00:00.000
47 14 9 3 2023-01-10 08:00:00.000
48 1 4 1 2023-01-17 11:00:00.000
49 12 9 3 2023-03-12 10:00:00.000
50 14 3 1 2023-01-10 10:00:00.000
51 14 7 2 2023-01-11 10:00:00.000
52 14 8 2 2023-01-12 11:00:00.000
53 1 12 4 2023-02-15 10:00:00.000
54 12 1 1 2023-01-17 10:00:00.000
55 14 5 1 2023-01-11 09:00:00.000
56 1 1 1 2023-01-16 10:00:00.000
57 5 15 5 2023-03-21 10:00:00.000
58 12 1 1 2023-04-10 11:00:00.000
59 14 1 1 2023-01-09 08:00:00.000
@@ -0,0 +1,97 @@
-- DIM
--DROP TABLE IF EXISTS mnoskov.core_dim_user ON CLUSTER clickhouse_cluster SYNC;
CREATE TABLE mnoskov.core_dim_user
ON CLUSTER clickhouse_cluster
(
user_id UInt64,
name String,
age UInt8,
email String,
registration_date DateTime
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/core_dim_user',
'{replica}'
)
ORDER BY user_id;
--DROP TABLE IF EXISTS mnoskov.core_dim_course ON CLUSTER clickhouse_cluster SYNC;
CREATE TABLE mnoskov.core_dim_course
ON CLUSTER clickhouse_cluster
(
course_id UInt64,
title String,
category LowCardinality(String),
created_at DateTime
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/core_dim_course',
'{replica}'
)
ORDER BY course_id;
--DROP TABLE IF EXISTS mnoskov.core_dim_lesson ON CLUSTER clickhouse_cluster SYNC;
CREATE TABLE mnoskov.core_dim_lesson
ON CLUSTER clickhouse_cluster
(
lesson_id UInt64,
title String,
duration_min UInt16,
course_id UInt64
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/core_dim_lesson',
'{replica}'
)
ORDER BY (lesson_id, course_id);
--DROP TABLE IF EXISTS mnoskov.core_dim_date ON CLUSTER clickhouse_cluster SYNC;
CREATE TABLE mnoskov.core_dim_date
ON CLUSTER clickhouse_cluster
(
date Date,
year Int16,
month Int8,
day Int8,
weekday LowCardinality(String)
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/core_dim_date',
'{replica}'
)
ORDER BY date;
-- FACT
--DROP TABLE IF EXISTS mnoskov.core_fact_lesson_views;
CREATE TABLE mnoskov.core_fact_lesson_views
ON CLUSTER clickhouse_cluster
(
user_id UInt64,
lesson_id UInt64,
course_id UInt64,
viewed_at DateTime
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/core_fact_lesson_views',
'{replica}'
)
PARTITION BY toYYYYMM(viewed_at)
ORDER BY (viewed_at, user_id); -- я если честно не знаю как с этой таблицей поступить в ORDER BY. Наставьте меня на путь истиный.
--DROP TABLE IF EXISTS mnoskov.core_enrollments;
CREATE TABLE mnoskov.core_enrollments
ON CLUSTER clickhouse_cluster
(
user_id UInt64,
course_id UInt64,
enrolled_at DateTime
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/core_enrollments',
'{replica}'
)
PARTITION BY toYYYYMM(enrolled_at)
ORDER BY (enrolled_at, user_id);
@@ -0,0 +1,128 @@
--DROP TABLE mnoskov.lesson_popularity_summary ON CLUSTER clickhouse_cluster sync;
CREATE TABLE mnoskov.lesson_popularity_summary
ON CLUSTER clickhouse_cluster
(
lesson_id UInt64,
lesson_title String,
course_id UInt64,
course_title String,
total_views AggregateFunction(count),
unique_users AggregateFunction(uniq, UInt64),
first_view AggregateFunction(min, DateTime),
last_view AggregateFunction(max, DateTime)
)
ENGINE AggregatingMergeTree
ORDER BY lesson_id;
--DROP VIEW mnoskov.mv_lesson_popularity_summary ON CLUSTER clickhouse_cluster SYNC;
CREATE MATERIALIZED VIEW mnoskov.mv_lesson_popularity_summary
ON CLUSTER clickhouse_cluster
TO mnoskov.lesson_popularity_summary
AS
SELECT
cdl.lesson_id AS lesson_id,
cdl.title AS lesson_title,
cdc.course_id AS course_id,
cdc.title AS course_title,
countIfState(flv.user_id != 0) AS total_views, -- я вообще ахуел когда узнал что такое существует(я про If у агрегаций). Я наткнулся на это когда осознал что кликхаус в join не ставит null, а ставит значение по умолчанию
uniqIfState(flv.user_id, flv.user_id != 0) AS unique_users,
minIfState(flv.viewed_at, flv.user_id != 0) AS first_view,
maxIfState(flv.viewed_at, flv.user_id != 0) AS last_view
FROM
mnoskov.core_fact_lesson_views flv
RIGHT JOIN
mnoskov.core_dim_lesson cdl ON flv.lesson_id = cdl.lesson_id -- поидее нужно большую таблицу ставить в левую часть JOIN, но если я тут так сделаю с фактами, то запрос кореектно не будет работать
JOIN
mnoskov.core_dim_course cdc ON cdl.course_id = cdc.course_id
GROUP BY
cdl.lesson_id, cdl.title, cdc.course_id, cdc.title;
SELECT * FROM mnoskov.core_fact_lesson_views;
SELECT
lesson_id,
any(lesson_title),
any(course_id),
any(course_title),
countMerge(total_views) AS total_views,
uniqMerge(unique_users) AS uniq_users,
minMerge(first_view) AS first_view,
maxMerge(last_view) AS last_view
FROM
mnoskov.lesson_popularity_summary
GROUP BY
lesson_id
ORDER BY
lesson_id;
-- ЕБАТЬ КАК Я АХУЕЛ КОГДА ДОПЕР ДО ТОГО ЧТО ЭТО НУЖНО ЧИТАТЬ ТАКИМ СПОСОБОМ А НЕ ПРОСТО ЧЕРЕЗ ЗВЕЗДОЧКУ. У меня MV ебать сколько изменений потерпела чтобы заработать, а проблема возможно изначально была в чтении.
-- Правда оно читается через раз, то есть результат то нет, но думаю это проблема движка AggregatingMergeTree.
-- Это получается чтобы был удобный вывод, теперь поверх этого селекта можно сделать обычную VIEW?
-- Заполненния и очищения:
TRUNCATE TABLE mnoskov.core_fact_lesson_views
ON CLUSTER clickhouse_cluster sync;
TRUNCATE TABLE mnoskov.lesson_popularity_summary
ON CLUSTER clickhouse_cluster sync;
INSERT INTO mnoskov.core_fact_lesson_views (user_id, lesson_id, course_id, viewed_at)
VALUES
(3, 6, 2, '2023-03-06 12:00:00'),
(4, 9, 3, '2023-04-02 10:00:00'),
(4, 6, 2, '2023-03-12 14:00:00'),
(4, 7, 2, '2023-03-13 09:00:00'),
(6, 3, 1, '2023-01-08 09:00:00'),
(6, 6, 2, '2023-01-11 14:00:00'),
(6, 7, 2, '2023-01-12 10:00:00'),
(6, 8, 2, '2023-01-13 11:00:00'),
(6, 9, 3, '2023-03-09 11:00:00'),
(7, 9, 3, '2023-03-11 14:00:00'),
(2, 9, 3, '2023-03-16 10:00:00'),
(2, 10, 3, '2023-03-16 10:30:00'),
(3, 2, 1, '2023-02-26 11:20:00'),
(4, 10, 3, '2023-04-03 10:00:00'),
(6, 2, 1, '2023-01-07 10:15:00'),
(6, 4, 1, '2023-01-08 09:30:00'),
(6, 13, 4, '2023-02-06 09:30:00'),
(7, 2, 1, '2023-01-14 10:20:00'),
(7, 3, 1, '2023-01-15 09:00:00'),
(7, 10, 3, '2023-03-11 14:30:00'),
(9, 13, 4, '2023-02-13 10:30:00'),
(13, 6, 2, '2023-01-20 14:00:00'),
(13, 7, 2, '2023-01-21 10:00:00'),
(2, 1, 1, '2023-01-21 09:00:00'),
(6, 1, 1, '2023-01-07 10:00:00'),
(6, 14, 4, '2023-02-07 10:00:00'),
(7, 1, 1, '2023-01-14 10:00:00'),
(9, 12, 4, '2023-02-13 10:00:00'),
(9, 1, 1, '2023-02-16 11:00:00'),
(3, 1, 1, '2023-02-26 11:00:00'),
(6, 5, 1, '2023-01-09 10:00:00'),
(6, 12, 4, '2023-02-06 09:00:00'),
(13, 12, 4, '2023-02-21 09:00:00'),
(1, 2, 1, '2023-01-16 10:15:00'),
(1, 3, 1, '2023-01-17 09:00:00'),
(1, 4, 1, '2023-01-17 09:30:00'),
(1, 4, 1, '2023-01-18 10:00:00'),
(1, 6, 2, '2023-02-02 14:00:00'),
(1, 13, 4, '2023-02-15 10:30:00'),
(5, 16, 5, '2023-03-22 11:00:00'),
(12, 2, 1, '2023-01-17 10:20:00'),
(12, 3, 1, '2023-04-10 11:30:00'),
(14, 2, 1, '2023-01-09 08:15:00'),
(14, 4, 1, '2023-01-10 10:30:00'),
(14, 6, 2, '2023-01-10 14:00:00'),
(14, 9, 3, '2023-01-10 08:00:00'),
(1, 4, 1, '2023-01-17 11:00:00'),
(12, 9, 3, '2023-03-12 10:00:00'),
(14, 3, 1, '2023-01-10 10:00:00'),
(14, 7, 2, '2023-01-11 10:00:00'),
(14, 8, 2, '2023-01-12 11:00:00'),
(1, 12, 4, '2023-02-15 10:00:00'),
(12, 1, 1, '2023-01-17 10:00:00'),
(14, 5, 1, '2023-01-11 09:00:00'),
(1, 1, 1, '2023-01-16 10:00:00'),
(5, 15, 5, '2023-03-21 10:00:00'),
(12, 1, 1, '2023-04-10 11:00:00'),
(14, 1, 1, '2023-01-09 08:00:00');
@@ -0,0 +1,75 @@
--DROP TABLE mnoskov.inactive_users_summary ON CLUSTER clickhouse_cluster sync;
CREATE TABLE mnoskov.inactive_users_summary
ON CLUSTER clickhouse_cluster
(
user_id UInt64,
name String,
email String,
age UInt8,
registered_courses_count UInt32,
registration_date DateTime
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/inactive_users_summary',
'{replica}'
)
ORDER BY user_id;
--DROP VIEW mnoskov.mv_inactive_users_summary ON CLUSTER clickhouse_cluster sync;
CREATE MATERIALIZED VIEW mnoskov.mv_inactive_users_summary
ON CLUSTER clickhouse_cluster
TO mnoskov.inactive_users_summary
AS
SELECT
u.user_id AS user_id,
u.name AS name,
u.email AS email,
u.age AS age,
e.registered_courses_count AS registered_courses_count,
u.registration_date AS registration_date
FROM
mnoskov.core_dim_user u
LEFT JOIN (
SELECT
user_id,
count() AS registered_courses_count
FROM
mnoskov.core_enrollments
GROUP BY
user_id
) e ON u.user_id = e.user_id
WHERE u.user_id NOT IN (SELECT lv.user_id FROM mnoskov.core_fact_lesson_views lv); -- я ломалася тут между NOT IN и NOT EXISTS, но решил оставить первый тк это уже витрины мы делаем, и NULL поидее быть не должно
-- Чтение очищение заполнение
SHOW TABLES FROM mnoskov;
SELECT * FROM mnoskov.core_dim_user;
SELECT * FROM mnoskov.inactive_users_summary;
TRUNCATE TABLE mnoskov.core_dim_user ON CLUSTER clickhouse_cluster SYNC;
TRUNCATE TABLE mnoskov.inactive_users_summary ON CLUSTER clickhouse_cluster SYNC;
INSERT INTO mnoskov.core_dim_user (user_id, name, age, email, registration_date)
VALUES
(1, 'Alice', 25, 'alice@mail.com', '2023-01-09 23:00:00'),
(2, 'Bob', 30, 'bob@gmail.com', '2023-02-04 23:00:00'),
(3, 'Charlie', 22, 'charlie@mail.com', '2023-02-19 23:00:00'),
(4, 'Diana', 28, 'diana@mail.com', '2023-02-28 23:00:00'),
(5, 'Ethan', 35, 'ethan@gmail.com', '2023-03-09 23:00:00'),
(6, 'Frank', 29, 'frank@mail.com', '2023-01-04 23:00:00'),
(7, 'Grace', 26, 'grace@gmail.com', '2023-01-11 23:00:00'),
(8, 'Henry', 32, 'henry@mail.com', '2023-01-19 23:00:00'),
(9, 'Iris', 24, 'iris@gmail.com', '2023-02-09 23:00:00'),
(10, 'Jack', 27, 'jack@mail.com', '2023-04-14 23:00:00'),
(11, 'Kelly', 23, 'kelly@gmail.com', '2023-04-19 23:00:00'),
(12, 'Leo', 31, 'leo@mail.com', '2023-01-14 23:00:00'),
(13, 'Mia', 26, 'mia@mail.com', '2023-01-17 23:00:00'),
(14, 'Nina', 28, 'nina@mail.com', '2023-01-07 23:00:00'),
(15, 'Oscar', 33, 'oscar@gmail.com', '2023-01-09 23:00:00'),
(16, 'Paul', 29, 'paul@mail.com', '2023-02-14 23:00:00'),
(17, 'Quinn', 24, 'quinn@gmail.com', '2023-03-19 23:00:00'),
(18, 'Rita', 27, 'rita@mail.com', '2023-03-31 23:00:00'),
(19, 'Sam', 30, 'sam@gmail.com', '2023-04-09 23:00:00'),
(21, 'Tinanal', 22, 'tinanal@mail.com', '2023-04-19 23:02:00'),
(22, 'Anal2', 24, 'tinanal222@mail.com', '2023-04-19 23:22:00');
@@ -0,0 +1,117 @@
--DROP TABLE mnoskov.course_completion_rate ON CLUSTER clickhouse_cluster sync;
CREATE TABLE mnoskov.course_completion_rate
ON CLUSTER clickhouse_cluster
(
user_id UInt64,
user_name String,
course_id UInt64,
course_title String,
lessons_in_course UInt16,
lesson_viewed UInt16,
completion_rate Float32
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/mnoskov/course_completion_rate',
'{replica}'
)
ORDER BY (user_id, course_id);
--DROP VIEW mnoskov.mv_course_completion_rate ON CLUSTER clickhouse_cluster sync;
CREATE MATERIALIZED VIEW mnoskov.mv_course_completion_rate
ON CLUSTER clickhouse_cluster
TO mnoskov.course_completion_rate
AS
SELECT
u.user_id AS user_id,
u.name AS user_name,
cl.course_id AS course_id,
cl.course_title AS course_title,
cl.lessons_in_course AS lessons_in_course,
lv.lesson_viewed AS lesson_viewed,
ifnull(round(toFloat32(ifnull(lv.lesson_viewed, 0)) / nullif(cl.lessons_in_course, 0), 2), 0) AS completion_rate -- вроде все логично
FROM
mnoskov.core_enrollments e
RIGHT JOIN
mnoskov.core_dim_user u ON e.user_id = u.user_id
JOIN (
SELECT
c.course_id,
c.title AS course_title,
uniq(lesson_id) lessons_in_course
FROM
mnoskov.core_dim_course c
JOIN
mnoskov.core_dim_lesson l ON l.course_id = c.course_id
GROUP BY
c.course_id, c.title
) cl ON e.course_id = cl.course_id
LEFT JOIN (
SELECT
user_id,
course_id,
uniq(lesson_id) AS lesson_viewed
FROM
mnoskov.core_fact_lesson_views
GROUP BY
user_id, course_id
) lv ON e.user_id = lv.user_id AND e.course_id = lv.course_id
ORDER BY
u.user_id, e.course_id;
-- Чтение очищение заполнение
SHOW TABLES FROM mnoskov;
SELECT * FROM mnoskov.core_enrollments;
SELECT * FROM mnoskov.course_completion_rate;
TRUNCATE TABLE mnoskov.core_enrollments ON CLUSTER clickhouse_cluster sync;
TRUNCATE TABLE mnoskov.course_completion_rate ON CLUSTER clickhouse_cluster sync;
INSERT INTO mnoskov.core_enrollments
(user_id, course_id, enrolled_at)
VALUES
(6, 1, '2023-01-05 23:00:00'),
(14, 2, '2023-01-08 23:00:00'),
(14, 3, '2023-01-08 23:00:00'),
(14, 1, '2023-01-08 23:00:00'),
(6, 2, '2023-01-09 23:00:00'),
(15, 1, '2023-01-10 23:00:00'),
(7, 1, '2023-01-12 23:00:00'),
(1, 1, '2023-01-14 23:00:00'),
(12, 1, '2023-01-15 23:00:00'),
(13, 2, '2023-01-18 23:00:00'),
(2, 1, '2023-01-19 23:00:00'),
(8, 3, '2023-01-21 23:00:00'),
(8, 1, '2023-01-21 23:00:00'),
(8, 2, '2023-01-21 23:00:00'),
(1, 2, '2023-01-31 23:00:00'),
(7, 2, '2023-01-31 23:00:00'),
(14, 4, '2023-01-31 23:00:00'),
(15, 2, '2023-01-31 23:00:00'),
(6, 4, '2023-02-04 23:00:00'),
(1, 4, '2023-02-09 23:00:00'),
(9, 4, '2023-02-11 23:00:00'),
(9, 1, '2023-02-14 23:00:00'),
(16, 2, '2023-02-15 23:00:00'),
(16, 4, '2023-02-15 23:00:00'),
(13, 4, '2023-02-19 23:00:00'),
(3, 1, '2023-02-24 23:00:00'),
(3, 2, '2023-03-04 23:00:00'),
(15, 3, '2023-03-04 23:00:00'),
(6, 3, '2023-03-07 23:00:00'),
(4, 2, '2023-03-09 23:00:00'),
(7, 3, '2023-03-09 23:00:00'),
(12, 3, '2023-03-09 23:00:00'),
(2, 3, '2023-03-14 23:00:00'),
(5, 5, '2023-03-19 23:00:00'),
(14, 5, '2023-03-19 23:00:00'),
(17, 3, '2023-03-21 23:00:00'),
(17, 5, '2023-03-24 23:00:00'),
(4, 3, '2023-03-31 23:00:00'),
(18, 1, '2023-04-01 23:00:00'),
(18, 4, '2023-04-04 23:00:00'),
(19, 1, '2023-04-10 23:00:00'),
(19, 2, '2023-04-10 23:00:00'),
(10, 1, '2023-04-15 23:00:00'),
(20, 2, '2023-04-18 23:00:00'),
(11, 2, '2023-04-20 23:00:00');
@@ -0,0 +1,36 @@
-- Топ 5 самых непросматреваемых уроков
SELECT
any(lesson_title) AS lesson_title,
any(course_title) AS course_title,
countMerge(total_views) AS total_views
FROM
mnoskov.lesson_popularity_summary
GROUP BY
lesson_id
ORDER BY
total_views
LIMIT 5;
-- Неактивные пользователи младше 26
SELECT
name,
age,
email
FROM
mnoskov.inactive_users_summary
WHERE
age < 26;
-- 3 круса с самым низкми процентом завершения
SELECT
course_title,
avg(completion_rate) AS avg_completion_rate
FROM
mnoskov.course_completion_rate
GROUP BY
course_title
ORDER BY
avg_completion_rate
LIMIT 3;
@@ -0,0 +1,2 @@
Разница есть только в таблицах mv_lesson_popularity_summary
Где в Greenplum - NULL, в clickhouse - 0. Потому что clickhouser сам подставляет 0 вместо NULL.