Data Science. SQL hub
По всем вопросам- @workakkk @itchannels_telegram - 🔥лучшие ит-каналы @ai_machinelearning_big_data - Machine learning @pythonl - Python @pythonlbooks- python книги📚 @datascienceiot - ml книги📚 РКН: https://vk.cc/cIi9vo #VRHSZ
Больше📈 Аналитический обзор Telegram-канала Data Science. SQL hub
Канал Data Science. SQL hub (@sqlhub) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 35 942 подписчиков, занимая 3 613 место в категории Технологии и приложения и 17 732 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 35 942 подписчиков.
Согласно последним данным от 30 августа, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило 45, а за последние 24 часа — 0, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 6.57%. В первые 24 часа после публикации контент обычно набирает 3.47% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 2 361 просмотров. В течение первых суток публикация набирает 1 246 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 11.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как sql, индекс, postgres, index, sqlite.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“По всем вопросам- @workakkk
@itchannels_telegram - 🔥лучшие ит-каналы
@ai_machinelearning_big_data - Machine learning
@pythonl - Python
@pythonlbooks- python книги📚
@datascienceiot - ml книги📚
РКН: https://vk.cc/cIi9vo
#VRHSZ”
Благодаря высокой частоте обновлений (последние данные получены 31 августа, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
ON и фильтром в WHERE. На картинке это отлично показано.
Когда мы пишем LEFT OUTER JOIN, мы ожидаем, что слева попадут все строки. Но результат зависит от того, где именно мы накладываем фильтры.
✨ Пример:
У нас есть две таблицы:
- Левая: фигура + число
- Правая: число + фигура
Мы делаем LEFT OUTER JOIN.
1. Фильтр в ON
Если написать ON right_table.number = 1, то соединение будет проверять условие именно во время джойна. Это значит: строки слева сохранятся, даже если справа нет совпадений — просто будут NULL.
2. Фильтр в WHERE
Если написать WHERE left_table.number = 1, то фильтрация произойдёт уже после объединения. В этом случае строки, не прошедшие условие, полностью исчезнут из результата.
⚡ Почему это нужно знать?
- ON управляет логикой соединения.
- WHERE убирает строки после соединения.
- В OUTER JOIN это принципиальная разница: при фильтре в ON мы сохраним «пустые» строки, при фильтре в WHERE они будут удалены.
📌 Вывод:
- Если нужно оставить все строки из левой таблицы и лишь добавить совпадения справа - фильтр ставим в ON.
- Если хотим действительно отобрать только подходящие строки — фильтр в WHERE.
Именно поэтому в сложных запросах всегда спрашивай себя: фильтр — это часть логики соединения или это окончательное ограничение?
#SQL #joins #databasessender_id и количество сообщений.
Подход:
1) Отфильтровать сообщения по интервалу августа — в T-SQL удобно задавать полуинтервалом [2022-08-01, 2022-09-01), без функций над датой (чтобы не ломать индексы).
2) Посчитать сообщения по sender_id.
3) Отсортировать по убыванию и взять TOP 2.
Если хотите корректно обрабатывать «ничьи» — используйте DENSE_RANK().
Быстрое решение (T-SQL):
SELECT TOP (2)
sender_id,
COUNT(*) AS message_count
FROM messages
WHERE sent_date >= '2022-08-01'
AND sent_date < '2022-09-01'
GROUP BY sender_id
ORDER BY COUNT(*) DESC, sender_id;
Вариант с учетом ничьих (tie-safe):
WITH monthly AS (
SELECT sender_id, COUNT(*) AS message_count
FROM messages
WHERE sent_date >= '2022-08-01'
AND sent_date < '2022-09-01'
GROUP BY sender_id
),
ranked AS (
SELECT sender_id, message_count,
DENSE_RANK() OVER (ORDER BY message_count DESC) AS rnk
FROM monthly
)
SELECT sender_id, message_count
FROM ranked
WHERE rnk <= 2
ORDER BY message_count DESC, sender_id;
Почему так:
- Фильтр по диапазону дат без функций сохраняет «sargable» запрос (используются индексы по sent_date).
- GROUP BY + COUNT(*) дают нужную метрику.
- DENSE_RANK() аккуратно захватывает все «совместные» вторые места.
@sqlhubPARTITION BY:
WITH numbered AS (
SELECT
id,
email,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
SELECT id, email
FROM numbered
WHERE rn = 1;
📌 Что происходит:
- PARTITION BY email группирует строки по email
- ROW_NUMBER() нумерует их внутри группы
- WHERE rn = 1 оставляет только первую запись (а все дубликаты убираются)
💡 Так можно элегантно чистить таблицы от дублей без лишних вложенных запросов.
Хочешь больше таких фишек? Подписывайся на нас и каждый день получай свежие приёмы, которые реально прокачают твои навыки разработчика! 🚀
@sqlhubemails(email_id, user_id, signup_date)
- texts(text_id, email_id, signup_action {'Confirmed','Not confirmed'}, action_date)
Решение (универсально для Postgres/MySQL):
SELECT DISTINCT e.user_id
FROM emails e
WHERE EXISTS (
SELECT 1
FROM texts t1
WHERE t1.email_id = e.email_id
AND t1.signup_action = 'Confirmed'
AND DATE(t1.action_date) = DATE(e.signup_date + INTERVAL '1 day') -- подтвердил на 2-й день
)
AND NOT EXISTS (
SELECT 1
FROM texts t0
WHERE t0.email_id = e.email_id
AND t0.signup_action = 'Confirmed'
AND DATE(t0.action_date) = DATE(e.signup_date) -- не подтвердил в день регистрации
);
Вариант через агрегацию (Postgres)🧩️️
SELECT e.user_id
FROM emails e
JOIN texts t ON t.email_id = e.email_id
GROUP BY e.user_id, e.signup_date
HAVING COUNT(*) FILTER (
WHERE t.signup_action = 'Confirmed' AND DATE(t.action_date) = DATE(e.signup_date)
) = 0
AND COUNT(*) FILTER (
WHERE t.signup_action = 'Confirmed' AND DATE(t.action_date) = DATE(e.signup_date + INTERVAL '1 day')
) >= 1;
@sqlhubCOUNT(DISTINCT ...) прямо в выборке.
SELECT
user_id,
COUNT(DISTINCT product_id) AS unique_products,
COUNT(DISTINCT category) AS unique_categories
FROM purchases
GROUP BY user_id;
🔎 В одном запросе можно узнать, сколько разных товаров и категорий купил каждый пользователь.
Это упрощает аналитику и заменяет сложные вложенные запросы.
@sqlhub