убрал два двоеточия

This commit is contained in:
mnoskov
2026-05-28 18:13:59 +03:00
parent 07712675d4
commit dd868283ed
2 changed files with 0 additions and 0 deletions
@@ -0,0 +1,90 @@
-- Задание 1
SELECT
name,
created_at::date,
current_date - created_at::date AS days_since_registration
FROM
mnoskov.users
WHERE
is_active = TRUE
AND current_date - created_at::date > 180
ORDER BY
days_since_registration desc;
-- Очень старым пользователям можно кинуть рассылку на почту на подобии 'Представляете, мы вместе уже 777 дней, вот вам купон на скидку'
-- Удобнее вычитать ::date, чтобы days_since_registration красиво выглядел в таблице
-- Задание 2
SELECT
name,
lower(email) AS email_clean,
substring(email FROM POSITION('@' IN email) + 1) AS domain
FROM
mnoskov.users
WHERE email IS NOT NULL
ORDER BY domain, name;
-- email приводят к нижнему регистру для нормализации записи, а зачем выделяют домен не понимаю, может быть для аналитики по типу кто какой почтой пользуется
-- Получу NULL в domain
-- Задание 3
SELECT
name,
age,
CASE
WHEN age < 25 THEN 'young'
WHEN age BETWEEN 25 AND 35 THEN 'adult'
WHEN age > 35 THEN 'senior'
END AS age_group
FROM
mnoskov.users
ORDER BY
age;
-- Почему удобнее держать логику сегментации в SQL (CASE), а не только в коде приложения? В каком коде? Если в 'коде приложения' - это какая-то отдельная программа, то могут предположить, чтобы передавать в приложение уже отфильтрованные данные, чтобы задачи базы данных не выносить из базы.
-- Если забыть в ветку ELSE, то будет NULL у тех кто никуда не попал
-- Задание 4
SELECT
name,
created_at::date,
current_date - created_at::date AS days_since_registration,
CASE
WHEN created_at >= current_date - INTERVAL '30 days' THEN 'hot' ELSE NULL
END AS hot_flag
FROM
mnoskov.users
WHERE
created_at >= current_date - INTERVAL '30 days';
-- Фильтрация по дате в WHERE исключает неподходящие варианты, а простой CASE в нашем случае возвращает результат в виде двух вариантов - подошло/не подошло и эти оба варианта остаются в таблице
-- Стоит запускать какие нибудь привлекательные варианты со скидкам и акциями, чтобы удержать пользователся
-- Задание 5
SELECT
count(*) AS total_users,
count(email) AS with_email,
count(*) - count(email) AS without_email,
((count(*) - count(email))::float / count(*)) * 100.0 AS percent_without_email
FROM
mnoskov.users;
-- Агрегаты дают более точную информацию чем просто на глаз
-- Я бы предолжил запустить активно вылезающие блоки с предложением зарегестрироваться, или же запретить пользоваение продуктом без регистрации
-- Задание 6
SELECT
name,
current_date - created_at::date AS days_since_registraion,
CASE
WHEN current_date - created_at::date <= 30 THEN 'new'
WHEN current_date - created_at::date BETWEEN 31 AND 180 THEN 'middle'
WHEN current_date - created_at::date > 180 THEN 'old'
END AS tenure_group,
is_active
FROM
mnoskov.users
ORDER BY
tenure_group, days_since_registraion;
-- Сегментация по стажу говорит о опыте человека, а по возрасту только о возрасте
-- Пересчитывать каждый день - плюсы: не занимает места на диске, минусы: тратит больше вычислительных ресурсов, а если хранить статическое поле, то все наоборот