fa
Feedback
Data Science. SQL hub

Data Science. SQL hub

رفتن به کانال در Telegram

По всем вопросам- @workakkk @itchannels_telegram - 🔥лучшие ит-каналы @ai_machinelearning_big_data - Machine learning @pythonl - Python @pythonlbooks- python книги📚 @datascienceiot - ml книги📚 РКН: https://vk.cc/cIi9vo #VRHSZ

نمایش بیشتر

📈 تحلیل کانال تلگرام Data Science. SQL hub

کانال Data Science. SQL hub (@sqlhub) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 35 848 مشترک است و جایگاه 3 835 را در دسته فناوری و برنامه‌ها و رتبه 18 129 را در منطقه روسيا دارد.

📊 شاخص‌های مخاطب و پویایی

از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 35 848 مشترک جذب کرده است.

بر اساس آخرین داده‌ها در تاریخ 13 ژوئن, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -8 و در ۲۴ ساعت گذشته برابر -11 بوده و همچنان دسترسی گسترده‌ای حفظ شده است.

  • وضعیت تأیید: تأیید نشده
  • نرخ تعامل (ER): میانگین تعامل مخاطب 9.82% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 4.08% واکنش نسبت به کل مشترکان کسب می‌کند.
  • دسترسی پست‌ها: هر پست به طور میانگین 3 522 بازدید دریافت می‌کند. در اولین روز معمولاً 1 461 بازدید جمع‌آوری می‌شود.
  • واکنش‌ها و تعامل: مخاطبان به‌طور فعال حمایت می‌کنند؛ میانگین واکنش به هر پست 13 است.
  • علایق موضوعی: محتوا بر موضوعات کلیدی مانند sql, индекс, postgres, index, sqlite تمرکز دارد.

📝 توضیح و سیاست محتوایی

نویسنده این فضا را محل بیان دیدگاه‌های شخصی توصیف می‌کند:
По всем вопросам- @workakkk @itchannels_telegram - 🔥лучшие ит-каналы @ai_machinelearning_big_data - Machine learning @pythonl - Python @pythonlbooks- python книги📚 @datascienceiot - ml книги📚 РКН: https://vk.cc/cIi9vo #VRHSZ

به لطف به‌روزرسانی‌های پرتکرار (آخرین داده در تاریخ 14 ژوئن, 2026)، کانال همواره به‌روز و دارای دسترسی بالاست. تحلیل‌ها نشان می‌دهد مخاطبان به‌طور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامه‌ها تبدیل کرده‌اند.

35 848
مشترکین
-1124 ساعت
-317 روز
-830 روز
آرشیو پست ها
🎯 SQL-задача с подвохом для аналитиков Таблица sales:

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    seller_name VARCHAR,
    sale_amount NUMERIC,
    sale_date DATE
);
📌 Задача: Найди имя продавца, который заработал максимальную сумму за каждый месяц. 🧠 Подвох: Многие пытаются использовать GROUP BY month, seller_name и MAX(), но это не даст имя продавца — только сумму. Нужно вернуть имя лучшего продавца за месяц. А если таких несколько? Тоже учти. 💡 Подсказки: • Сначала сгруппируй продажи по month и seller_name • Посчитай SUM(sale_amount) • Используй оконную функцию RANK() или ROW_NUMBER() • Отфильтруй только те строки, где rank = 1 🧩 Решение:

WITH monthly_totals AS (
    SELECT
        DATE_TRUNC('month', sale_date) AS month,
        seller_name,
        SUM(sale_amount) AS total
    FROM sales
    GROUP BY 1, 2
),
ranked AS (
    SELECT *,
           RANK() OVER (PARTITION BY month ORDER BY total DESC) AS rnk
    FROM monthly_totals
)
SELECT month, seller_name, total
FROM ranked
WHERE rnk = 1
ORDER BY month;
👀 Бонус-вопрос: Что будет, если у двух продавцов одинаковая сумма за месяц? Какой оконной функцией это корректно учесть? 👉 RANK() вернёт обоих, ROW_NUMBER() — только одного. 📌 Отличная задача, чтобы проверить знание оконных функций и работы с агрегацией в SQL. @sqlhub

🚀 Запуск обновленной версии курса «ML для финансового анализа»! Пройдите полный цикл создания торгового агента: от сбора и о
🚀 Запуск обновленной версии курса «ML для финансового анализа»! Пройдите полный цикл создания торгового агента: от сбора и очистки данных до переноса в продакшн. Уже через полгода вы сможете самостоятельно разработать торгового бота! 🔹 Новое в программе - Портфельные стратегии и модели перебалансировки. - Предсказание цен с LSTM и оценка текстов. - Ансамбль блендинга с LLM. 🔹 Структура курса - Пошаговое обучение с домашними заданиями для создания торгового бота. 🔹 Адаптация под ваши запросы - Синтетические датасеты, свечные графики, очистка данных и многое другое. 🔹 Практический модуль - Перенос модели в продакшн, облачная инфраструктура, микросервисы и контроль метрик. 🎉 Специальное предложение Успейте воспользоваться 🏷10% скидкой на курс «ML для финансового анализа» и 🎁 бонусным промокодом FINANCE_5 и учитесь по ценам мая! Выгодные условия действуют по 31 мая включительно. ➡️ Ссылка для регистрации: https://tglink.io/bc637989f23f?erid=2W5zFK19MMi #реклама О рекламодателе

YTsaurus, разработанная в Яндексе платформа для хранения и обработки больших данных, стала доступна как управляемый сервис в Yandex Cloud. До 2023 года YTsaurus использовалась только внутри компании - для обучения нейросетей, аналитики, обработки телеметрии и работы с поисковым индексом. В прошлом году платформу выложили в опенсорс, и с тех пор она применяется как внутри Яндекса, так и за его пределами. Теперь YTsaurus можно развернуть в облаке - без ручной настройки и с поддержкой от команды Яндекса. Платформа работает с эксабайтами данных, масштабируется до миллиона CPU и десятков тысяч GPU, поддерживает ClickHouse, Spark, MapReduce и подходит для любых сценариев - от ETL до построения хранилищ. Заявки на ранний доступ уже открыты.

🦆 DuckDB теперь дружит с scikit-learn — мощный дуэт для ML-прототипов В свежем гайде от 16 мая 2025 команда DuckDB показывае
🦆 DuckDB теперь дружит с scikit-learn — мощный дуэт для ML-прототипов В свежем гайде от 16 мая 2025 команда DuckDB показывает, как использовать их аналитическую СУБД вместе с scikit-learn — чтобы максимально быстро и удобно прототипировать модели машинного обучения. 💡 Пример — классификация пингвинов (датасет Palmer Penguins): 🔸 Предобработка в DuckDB: Удаление NULL-ов, фильтрация, типизация. Категориальные признаки кодируются через референс-таблицы (вместо LabelEncoder). Используется selection_query с ленивым выполнением — данные грузятся только при необходимости. 🔸 Интеграция с scikit-learn: Извлекаем pandas DataFrame прямо из DuckDB. Обучаем классификатор (например, RandomForestClassifier) по подготовленным данным. 🛠 Идеально для: • Быстрого прототипирования моделей • Малых и средних наборов данных • Python-разработчиков, которым не хочется возиться с SQL-серверами 📎 Подробнее: https://duckdb.org/2025/05/16/scikit-learn-duckdb.html @sqlhub

7–8 июня проводим Weekend Offer Analytics Устроиться в Яндекс за выходные — реально. Ищем крутых аналитиков с опытом работы от 3 лет на Python, готовых работать в офисном или гибридном режиме. Подавайте заявку до 3 июня — и всего за 2 дня пройдите технические собеседования. После сможете пообщаться с двенадцатью нанимающими командами и выбрать ту, которая покажется самой интересной. Если всё сложится хорошо, сразу же пришлём вам офер. Узнать подробности и зарегистрироваться. Реклама. ООО "Яндекс". ИНН 7736207543

⚡️ SQL-шпаргалка, которая выручит в интервью, проекте и проде Полный мастер-гайд по SQL в одном PDF: практичные примеры, чёткие объяснения и никакой воды. Что внутри: • 💬 Создание баз, таблиц и изменение схем • 💬 Запросы любого уровня сложности: JOIN, GROUP BY, HAVING, PARTITION • 💬 Подзапросы, CTE, оконные функции: ROW_NUMBER, RANK, DENSE_RANK • 💬 VIEW, временные таблицы и работа с дубликатами • 💬 Даты, строки, преобразования и агрегации • 💬 Очистка данных, разбиение по разделителям • 💬 UNION, INTERSECT, EXCEPT — управление сложными выборками Затрагиваются и продвинутые кейсы: • Парсинг адресов • Кастомная сортировка • Использование ISNULL и COALESCE 🧠 Это не просто набор команд — это концентрат боевого SQL-опыта. Подходит для: ➡️ Подготовки к SQL-интервью ➡️ BI и аналитики ➡️ Web-разработки с базами ➡️ Встраивания SQL в проекты на Python, Go, Java и других языках

🚀 Сертификация DataLens Analyst — способ подтвердить свою экспертизу в BI и систематизировать работу с одним из самых популя
🚀 Сертификация DataLens Analyst — способ подтвердить свою экспертизу в BI и систематизировать работу с одним из самых популярных российских BI-инструментов — платформой от Yandex Cloud. Подходит всем, кто строит чарты, дашборды и анализирует данные. Сертификация охватывает ключевые темы: вычисляемые поля, параметры, датасеты, подключения к источникам, навигацию и управление доступом. Подготовка простая: бесплатный курс и примеры заданий собраны на одной странице. 🎯 До конца августа сертификация стоит 2 500 ₽ вместо 5 000 ₽ — отличный повод добавить сильную строчку в резюме https://vk.cc/cMn3KE

🧠 SQL-задача с подвохом: кто на самом деле опоздал? У тебя есть таблица с логами входа сотрудников в офис. Но задача не в том, чтобы просто найти "кто пришёл позже 9:00", а выяснить кого стоит считать реально опоздавшим, если учесть такую бизнес-логику: > Сотрудники входят в офис через турникет. Иногда турникет сканирует пропуск с задержкой, а иногда — несколько сотрудников входят подряд. Поэтому, если кто-то зашёл не позже, чем через 2 минуты после своего коллеги из той же команды — его не считают опоздавшим. 📊 Данные

CREATE TABLE office_logs (
    employee_id INT,
    team_id INT,
    entry_time TIMESTAMP
);
Пример данных: | employee_id | team_id | entry_time | |-------------|---------|---------------------| | 1 | 10 | 2024-01-01 08:59:10 | | 2 | 10 | 2024-01-01 09:00:50 | | 3 | 10 | 2024-01-01 09:02:20 | | 4 | 20 | 2024-01-01 09:03:00 | | 5 | 20 | 2024-01-01 09:04:40 | | 6 | 20 | 2024-01-01 09:10:00 | 🎯 Задача Напиши SQL-запрос, который определяет реально опоздавших сотрудников, если: 1. Время входа позже 09:00:00 2. Они не шли следом за коллегой из своей команды (разница входа больше 2 минут) 3. Один и тот же сотрудник не может быть "оправдан" несколькими — ищем только ближайшего предыдущего по времени из своей команды 💡 Подсказка: тут нужны: - оконные функции (`LAG`) - фильтрация по team_id - расчёт интервалов времени - доп. условия на время и порядок Реальное мышление аналитика начинается там, где бизнес-логика важнее простых фильтров.Решение: ```sql WITH logs_with_prev AS ( SELECT employee_id, team_id, entry_time, LAG(entry_time) OVER ( PARTITION BY team_id ORDER BY entry_time ) AS prev_entry_time FROM office_logs ), marked_late AS ( SELECT *, EXTRACT(EPOCH FROM (entry_time - prev_entry_time)) AS seconds_diff FROM logs_with_prev ) SELECT employee_id, team_id, entry_time FROM marked_late WHERE entry_time::time > '09:00:00' AND ( prev_entry_time IS NULL OR EXTRACT(EPOCH FROM (entry_time - prev_entry_time)) > 120 ); ``` 🔍 **Что происходит:** • Сначала `LAG` находит предыдущего входившего из той же команды • Затем считаем, сколько секунд прошло между входами • Если прошло больше 2 минут или сотрудник был первым — он **реально опоздал** 📦 Такое решение пригодится, если нужно учитывать **контекст** и **временные связи**, а не просто жёсткие фильтры. @sqlhub

🧠 Уровень Pro: Медиана, ранги и NULL в Oracle SQL 📋 Есть таблица sales:

CREATE TABLE sales (
  salesman_id NUMBER,
  region VARCHAR2(50),
  amount NUMBER
);
📦 Данные: | salesman_id | region | amount | |-------------|------------|--------| | 101 | 'North' | 200 | | 101 | 'North' | NULL | | 102 | 'North' | 150 | | 103 | 'North' | NULL | | 104 | 'South' | 300 | | 105 | 'South' | NULL | | 106 | 'South' | 50 | | 107 | 'South' | NULL | 🎯 Задача 2.0: Вывести salesman_id, чья сумма продаж меньше медианы по региону, и показать ранг продавца внутри региона по сумме продаж, где NULL = 0. ⚠ Подвохи: - MEDIAN() доступен только в Oracle. - Нужно предварительно агрегировать суммы. - Продавцы с только NULL-продажами = 0. - Ранг должен учитывать правильную сортировку и связи с регионом. ✅ Решение: ```sql WITH sales_total AS ( SELECT salesman_id, region, NVL(SUM(amount), 0) AS total_sales FROM sales GROUP BY salesman_id, region ), region_median AS ( SELECT region, MEDIAN(total_sales) AS region_median FROM sales_total GROUP BY region ), ranked AS ( SELECT st.salesman_id, st.region, st.total_sales, r.region_median, RANK() OVER (PARTITION BY st.region ORDER BY st.total_sales DESC) AS sales_rank FROM sales_total st JOIN region_median r ON st.region = r.region ) SELECT * FROM ranked WHERE total_sales < region_median; ``` 🧠 Объяснение: 1. `sales_total`: агрегируем продажи по продавцу, `NULL → 0` 2. `region_median`: считаем **медиану** продаж по каждому региону 3. `ranked`: добавляем `RANK()` по убыванию продаж внутри региона 4. Финальный фильтр: продажи ниже медианы 🔍 Пример вывода: | salesman_id | region | total_sales | region_median | sales_rank | |-------------|--------|-------------|----------------|-------------| | 105 | South | 0 | 50 | 3 | | 107 | South | 0 | 50 | 3 | | 103 | North | 0 | 150 | 3 | 📌 Польза: ✅ Отлично проверяет: - знание оконных функций - работу с медианой - поведение `NULL` в агрегатах - построение CTE-цепочек и аналитики 🔁 Можно расширить: - Добавить ранги *по убыванию и по возрастанию* - Вместо `MEDIAN()` использовать `PERCENTILE_CONT()` - Построить дэшборд: кто всегда "ниже медианы" за месяц @sqlhub

🛠️ История создания “storage-agnostic” message queue Контекст: Работая на Go, автор вдохновился инструментами из Node.js эко
🛠️ История создания “storage-agnostic” message queue Контекст: Работая на Go, автор вдохновился инструментами из Node.js экосистемы (BullMQ, RabbitMQ) и захотел сделать что-то похожее, но с нуля, без зависимостей. Так родилась идея — сначала он создал Gocq (Go Concurrent Queue): простую concurrent-очередь, работающую через каналы. ⚡ Основная проблема Gocq отлично работал в памяти, но не поддерживал устойчивое хранение задач. Автор задумался: а можно ли сделать очередь, не зависящую от конкретного хранилища — так, чтобы её можно было подключить к Redis, SQLite или совсем без них? 🧱 Как это реализовано в VarMQ После рефакторинга Gocq был разделён на два компонента: 1) Worker pool — пул воркеров, обрабатывающих задачи 2) Queue interface — абстракция над очередью, не зависящая от реализации Теперь воркер просто берёт задачи из очереди, не зная, где они хранятся. 🧠 Пример использования • In-memory очередь:

w := varmq.NewVoidWorker(func(data any) {
   // обработка задачи
}, 2)
q := w.BindQueue()
• С SQLite-поддержкой:

import "github.com/goptics/sqliteq"

db := sqliteq.New("test.db")
pq, _ := db.NewQueue("orders")
q := w.WithPersistentQueue(pq)
• С Redis (для распределённой обработки):

import "github.com/goptics/redisq"

rdb := redisq.New("redis://localhost:6379")
pq := rdb.NewDistributedQueue("transactions")
q := w.WithDistributedQueue(pq)
В итоге воркер обрабатывает задачи одинаково — независимо от хранилища. ✅ Почему это круто • Гибкость: адаптеры позволяют легко менять хранилище без правок воркера • Минимальные зависимости: в яд 📌 Читать

Истории, после которых ты захочешь уволиться Ты правда думал, что так и будешь сидеть в найме до пенсии? А потом читаешь пост какого-то чувака из IT и ловишь: “бл*, я тоже так хочу”. В этом канале бывший дата саентист — Глеб Михайлов. Он уволился из Яндекса, послал всё на*** и теперь пишет как есть: – про выгорание, – про деньги, свободу и зашквар, – и как из всего этого лепить свою жизнь. Топ постов канала: 👉 7 лет отсидки (https://t.me/mikhaylovgleb/336) (в офисе) 👉 Страшно – пи***ц (https://t.me/mikhaylovgleb/302) 👉 Робот-пылесос для денег (https://t.me/mikhaylovgleb/347) Подпишись - https://t.me/mikhaylovgleb, если тоже устал терпеть. Тут честно, смешно и немного больно — как в жизни. Реклама

🐘 pgBackRest — надежное решение для резервного копирования PostgreSQL. В отличие от стандартных утилит, pgBackRest предлагае
🐘 pgBackRest — надежное решение для резервного копирования PostgreSQL. В отличие от стандартных утилит, pgBackRest предлагает параллельное выполнение операций, поддержку инкрементных бэкапов на уровне блоков и встроенную проверку целостности через контрольные суммы. Особого внимания заслуживает гибкость развертывания: резервные копии можно хранить локально, на удаленных серверах через SSH/TLS или в облачных хранилищах S3/Azure/GCS. Система автоматически управляет ротацией архивов и обеспечивает консистентность данных даже при аварийном завершении работы. 🤖 GitHub @sqlhub

В мире, где данные — это новая валюта, каждый специалист должен уметь работать с ними на высшем уровне. Особенно — аналитики.
В мире, где данные — это новая валюта, каждый специалист должен уметь работать с ними на высшем уровне. Особенно — аналитики. Сделать уверенный старт в профессии можно на курсе «Аналитик данных» от karpovꓸcourses. Вы узнаете, как наводить порядок в потоке данных, выявлять скрытые связи, превращать хаотичные цифры в понятные факты и точные решения, которые помогают бизнесу двигаться вперед. На курсе есть все, что нужно для эффективной работы с данными: от Python и SQL до BI-инструментов и создания дашбордов. С 12 по 31 мая погружаться в аналитику еще выгоднее. При покупке курса «Аналитик данных» и симулятора A/B-тестов вы получите скидку 10%. А главное, сразу усилите резюме ценными навыками. Реклама. ООО «Карпов Курсы», ИНН: 7811764627, erid: 2VtzqunnpSp

🗂️ BRModelo Web — веб-приложение для проектирования баз данных. Этот open-source проект позволяет создавать ER-диаграммы пря
🗂️ BRModelo Web — веб-приложение для проектирования баз данных. Этот open-source проект позволяет создавать ER-диаграммы прямо в браузере с экспортом в SQL-скрипты. Инструмент имеет образовательную направленность. Интерфейс на португальском и английском языках адаптирован для учебных задач: есть подсветка сущностей, автоматическая расстановка связей и валидация схемы. Запустить локальную копию можно через Node.js + MongoDB или Docker-контейнеры. 🤖 GitHub @sqlhub

👣 Stateless Postgres Query Router — это система шардирования для PostgreSQL-кластера, доступная с открытым исходным кодом. Е
👣 Stateless Postgres Query Router — это система шардирования для PostgreSQL-кластера, доступная с открытым исходным кодом. Её основной компонент, роутер, анализирует запросы и определяет, на каком конкретном PostgreSQL-кластере следует выполнить транзакцию или запрос. Ключи шардирования могут передаваться в запросе как явно, так и неявно, в виде комментариев. В SPQR реализованы функции транзакционного и сессионного пулинга, автобалансировки шардированных таблиц, а также поддержка всех возможных методов аутентификации, сбора статистики и динамической перезагрузки конфигурации. SPQR поддерживает как запросы к определённому шарду, так и запросы ко всем шардам. В ближайших планах — добавить поддержку двухфазных транзакций и референсных таблиц. Исходный код SPQR распространяется под лицензией PostgreSQL Global Development Group ⚡️ Ссылки: 🟢https://github.com/pg-sharding/spqr 🟢https://pg-sharding.tech/ @sqlhub

🐘 Slonik — проверенный клиент PostgreSQL для Node.js с строгой типизацией и детальным логированием. Этот инструмент решает п
🐘 Slonik — проверенный клиент PostgreSQL для Node.js с строгой типизацией и детальным логированием. Этот инструмент решает проблему безопасности и предсказуемости работы с SQL-запросами: вместо ручного формирования запросов проект заставляет использовать литералы с автоматическим экранированием параметров. Интересна встроенная интеграция с Zod для валидации результатов запросов, она предотвращает ошибки при изменении схемы БД без обновления кода. Также Slonik умеет логировать стектрейсы вызовов запросов и перезапускать упавшие транзакции. 🤖 GitHub @sqlhub

Изучите секреты самых популярных open source key-value СУБД – Redis и Valkey В высоко-нагруженных сервисах Redis — не просто
Изучите секреты самых популярных open source key-value СУБД – Redis и Valkey В высоко-нагруженных сервисах Redis — не просто кэш, а важная подсистема, на которой строится значимая часть бизнес-логики. От его стабильности, масштабируемости и отказоустойчивости зависит производительность всего сервиса. Valkey - это современный производительный форк Redis с открытым исходным кодом, поддерживаемый сообществом и рядом крупных компаний. Valkey набирает популярность, поддержан крупными облачными провайдерами, и вполне возможно потеснит или вовсе заменит Redis со временем. Наш курс — для тех, кто хочет держать свой стэк и знания актуальными и глубоко разбираться, как устроен Redis и Valkey. 🌐 В программе курса: 🤩 Как эффективно использовать базовые и продвинутые структуры данных: HyperLogLog, Bitmaps и Bisields, Streams, Geospatial-индексы, Bloom Filters 🤩 Как проектировать in-memory системы, которые не разваливаются под нагрузкой, что влияет на отказоустойчивость и как её добиться 🤩 Как работает репликация и кластеризация на практике (режимы Sentinel и Cluster) 🤩 Как встроить Redis/Valkey в реальный прод с учётом безопасности, интеграций и современных практик мониторинга. 🥸 Кто мы: R&D-центр Devhands. Автор курса — Константин Ратвин — преподаватель МФТИ на кафедре БИТ (совместно со СберТех), эксперт по распределённым системам и банковским ИТ, автор курсов по СУБД и инфраструктуре, спикер HighLoad++ и PGConf. 🗓 Старт курса: 9 июня, 6 недель обучения. Изучить программу и записаться можно здесь. Ждем вас! Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqwXctGc

🦦 Walrus — удобная обёртка над Redis для Python-разработчиков. Этот проект расширяет стандартный клиент redis-py, добавляя к
🦦 Walrus — удобная обёртка над Redis для Python-разработчиков. Этот проект расширяет стандартный клиент redis-py, добавляя к нему набор полезных абстракций для работы с Redis. Вместо того чтобы заставлять изучать новый API, Walrus предлагает привычный интерфейс с дополнительными возможностями. При этом проект остаётся лёгковесным и сохраняет совместимость с альтернативными Redis-подобными базами вроде rlite. 🤖 GitHub @sqlhub

Если вы размышляете, как усилить своё резюме, наш совет — освойте SQL. Это язык, который помогает извлекать ценную информацию
Если вы размышляете, как усилить своё резюме, наш совет — освойте SQL. Это язык, который помогает извлекать ценную информацию из массивов данных. Познакомиться с инструментом можно на бесплатном курсе «Введение в SQL и работу с базой данных». За 5 занятий вы научитесь создавать, редактировать и обновлять базы данных, сделаете свои первые запросы и отчёты. Курс будет полезен даже тем, кто пока не собирается становиться аналитиком. Научитесь применять SQL в своих задачах — с ним вы сможете больше – https://netolo.gy Реклама. ООО "Нетология". ИНН 7726464125 Erid: 2VSb5y1d224

🧠 SQL-задача с подвохом: “Самый активный — или самый невидимый?” 📘 Условие У тебя есть две таблицы:

users(id, name)
posts(id, user_id, title)
Вопрос: Выведи всех пользователей, у которых нет ни одного поста, а также пользователя, у которого больше всего постов. 📌 Но — в одном запросе. ❓ Попробуй решить задачу таким SQL:

SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0 OR COUNT(p.id) = (
    SELECT MAX(cnt)
    FROM (
        SELECT COUNT(*) AS cnt
        FROM posts
        GROUP BY user_id
    ) t
);
🔍 Вопрос: 1) Почему он может вернуть неправильный результат? 2) В чём разница между COUNT(*) и COUNT(p.id)? 3) Как переписать его правильно? ✅ Разбор подвоха 💣 Подвох 1: COUNT(p.id) пропускает NULL Когда ты делаешь LEFT JOIN, для пользователей без постов p.id = NULL. • COUNT(*) считает все строки (включая NULL) • COUNT(p.id) не считает строки, где p.id IS NULL 👉 Это может привести к тому, что: • COUNT(p.id) = 0 — действительно "нет постов" • но в подзапросе SELECT COUNT(*) считает иначе и даёт искаженную MAX(cnt) 🔁 Как правильно: 1) Подзапрос должен использовать COUNT(p.id), чтобы сравнение было честным 2) Либо использовать JOIN вместо LEFT JOIN в подзапросе, чтобы не попасть на "нулевых" пользователей ✅ Финальный корректный запрос:

SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0
   OR COUNT(p.id) = (
       SELECT MAX(cnt)
       FROM (
           SELECT user_id, COUNT(p.id) AS cnt
           FROM posts
           GROUP BY user_id
       ) AS ranked
   );
🎯 Такой запрос честно покажет: • Всех “молчунов” (0 постов) • И самого активного автора (макс постов) 📌 Отлично подходит для собеседования или тех, кто считает, что "GROUP BY — это просто". @sqlhub