Нашёл для себя крутой канал про BI и дашборды — «Пирожки и бары»
Ведёт Маша, тимлид BI-аналитиков в Авито
Здесь реально полезно и при этом не занудно. Например, недавно там была прожарка графиков для королевы Елизаветы II — да, вы не ослышались
Ещё рекомендую глянуть:
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳6❤🔥5 5
Формируем сессии для пользователей по указанному интервалу времени в SQL. Часть 2
В предыдущем посте мы просто нашли разрывы неактивности. Сейчас рассмотрим продолжение «Сгруппируй все действия в сессии активности».
Давайте разберем это на примере с двумя пользователями (Вася и Петя) по шагам.
Исходные данные (6 строк логов):
| user_id | action_time | Комментарий
|---------|-------------|-------------
| Вася | 10:00 | Старт Васи (Сессия 1)
| Вася | 10:15 | Вася активен
| Вася | 11:30 | Разрыв! (75 мин) → Старт Васи (Сессия 2)
| Вася | 11:40 | Вася активен
| Петя | 12:00 | Старт Пети (Сессия 1)
| Петя | 12:10 | Петя активен
Шаг 1. Находим моменты «разрыва»:
С помощью
LAG мы смотрим разницу с предыдущим временем внутри каждого юзера. Если разница > 30 минут — ставим флаг 1.| user_id | action_time | Diff | is_new_session |
|---------|-------------|--------|------------------------|
| Вася | 10:00 | - | 0 |
| Вася | 10:15 | 15 мин | 0 |
| Вася | 11:30 | 75 мин | 1 (Новый остров) |
| Вася | 11:40 | 10 мин | 0 |
| Петя | 12:00 | - | 0 (Сброс счетчика) |
| Петя | 12:10 | 10 мин | 0 |
WITH step1 AS (
SELECT
user_id,
action_timestamp,
CASE
WHEN action_timestamp - LAG(action_timestamp) OVER(PARTITION BY user_id ORDER BY action_timestamp) > interval '30 minutes'
THEN 1 ELSE 0
END as is_new_session
FROM user_actions
),
Шаг 2. Хитрый трюк с кумулятивной суммой:
Нам нужно дать строчкам одной сессии общий ID. Мы суммируем наши флаги сверху вниз. Благодаря
PARTITION BY user_id сумма сбрасывается для нового юзера.| user_id | action_time | is_new_session | session_id (Сумма) |
|---------|-------------|----------------|---------------------------|
| Вася | 10:00 | 0 | 0 |
| Вася | 10:15 | 0 | 0 |
| Вася | 11:30 | 1 | 1 (Сумма стала 1) |
| Вася | 11:40 | 0 | 1 |
| Петя | 12:00 | 0 | 0 (Счетчик обнулился!) |
| Петя | 12:10 | 0 | 0 |
step2 AS (
SELECT
*,
SUM(is_new_session) OVER(PARTITION BY user_id ORDER BY action_timestamp) as session_id
FROM step1
)
Шаг 3. Финальная агрегация (и как сделать ID уникальным):
Теперь всё просто: мы говорим базе «Сгруппируй все действия с одинаковым
user_id и session_id в одну строку». Чтобы ID был глобально уникальным, мы склеиваем их.| user_id | unique_session_id | start | end | count |
|---------|-------------------|--------|--------|-------|
| Вася | Вася_0 | 10:00 | 10:15 | 2 |
| Вася | Вася_1 | 11:30 | 11:40 | 2 |
| Петя | Петя_0 | 12:00 | 12:10 | 2 |
SELECT
user_id,
-- Генерируем уникальный ID для сессии
user_id || '_' || session_id as unique_session_id,
MIN(action_timestamp) as session_start,
MAX(action_timestamp) as session_end,
COUNT(*) as actions_count
FROM step2
GROUP BY user_id, session_id
Давайте так: 👇
Вы накидываете интересные вам задачи в комментарии и я постараюсь разбирать некоторые из них в следующих постах. Ну и давайте наберем под этим постом 50 реакций ❤️ и я чуть позже приложу в комментариях этот пост в формате markdown для вашего удобства.
Итог:
Сохраняйте этот пример, чтобы не запутаться в логике!
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥24 10🐳9🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
«Мои навыки написания кода атрофируются» —цитата Андрея Карпатого.
Того самого, кто строил OpenAI и автопилот в Tesla.
Если даже такие гиганты признают, что перестают писать код «руками», то к чему готовиться нам? Просто нажимать кнопку «Сделай красиво» и надеяться на чудо? Скажу честно: я и сам всё меньше «пишу» и всё больше «проверяю». Дирижирую нейронками.
Казалось бы, вот оно — счастье: машина работает за тебя. Но именно за этой иллюзорной легкостью и зарыта главная западня, о которой молчат адепты «нейросети заменят всех»:
Итог:
Есть одна жесткая правда: ИИ делает умных умнее, а глупых — ещё глупее.
Если у вас есть база, нейронка становится вашим множителем. Она дает вам суперсилу и высвобождает время для реально сложных задач. Но если ваши знания в коде — это «ноль», то результат умножения на ИИ всё равно останется нулевым.
Учите базу сейчас, чтобы завтра быть тем самым «дирижёром», который ведет проект
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥16 7🐳6🔥1
Пятница — время релизов! Пока все уходят на чилл, я допилил то, что давно хотел: свою собственную базу знаний.
🔥 Ловите ссылку: dima-sqlit.ru
Скажу честно: это максимальный MVP. Я просто затащил туда часть постов из канала. Где-то криво, где-то косо, верстка местами может поплыть, но суть не в этом.
Почему я решил, что сайт — это круче, чем просто Telegram?
Что дальше? В планах — докрутить поиск, добавить новые категории и переписать посты в корректном виде.
Итог:
Это только начало. Мне очень важно ваше мнение: зайдите, потыкайте, оставьте обратную связь.
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤🔥30🔥14🐳6 3
🤖 Как бесплатно использовать Claude Code на базе Claude Sonnet 4.5:
Друзья, сегодня расскажу, как можно бесплатно попробовать Claude Code — мощный инструмент для работы с кодом на базе Claude Sonnet 4.5.
Что это даёт?
🔥 Claude Code — это не просто чат-бот. Это полноценный AI-ассистент для разработки, который умеет:
• Читать и анализировать код
• Писать и рефакторить функции
• Помогать с отладкой
• Работать с файлами проекта
Обычно доступ к Claude Sonnet 4.5 платный, но есть способ протестировать его бесплатно через omniroute.
Как это сделать:
1️⃣ Посмотрите это видео — там пошагово показано, как получить доступ к Claude Sonnet 4.5 через omniroute (код из видео я приложил в комментариях для вашего удобства).
2️⃣ Следуйте инструкциям из видео — настройка занимает буквально 10-15 минут.
3️⃣ Запускайте Claude Code и тестируйте все возможности: от генерации кода до работы с вашими проектами.
Почему стоит попробовать прямо сейчас?
⚡️ Пока есть возможность бесплатного доступа — используйте её! Это отличный шанс оценить, насколько AI может ускорить вашу работу с кодом.
🔥 Поставьте 50 реакций на этот пост — и я начну делать серию материалов о том, как я применяю нейронные сети в работе и повседневной жизни! Покажу реальные кейсы, которые упрощают рутину и экономят часы времени.
🚬 Провожу консультации по нейросетям: научу использовать эффективно, экономить на подписках и учиться быстрее с помощью AI.
🗽Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Друзья, сегодня расскажу, как можно бесплатно попробовать Claude Code — мощный инструмент для работы с кодом на базе Claude Sonnet 4.5.
Что это даёт?
🔥 Claude Code — это не просто чат-бот. Это полноценный AI-ассистент для разработки, который умеет:
• Читать и анализировать код
• Писать и рефакторить функции
• Помогать с отладкой
• Работать с файлами проекта
Обычно доступ к Claude Sonnet 4.5 платный, но есть способ протестировать его бесплатно через omniroute.
Как это сделать:
1️⃣ Посмотрите это видео — там пошагово показано, как получить доступ к Claude Sonnet 4.5 через omniroute (код из видео я приложил в комментариях для вашего удобства).
2️⃣ Следуйте инструкциям из видео — настройка занимает буквально 10-15 минут.
3️⃣ Запускайте Claude Code и тестируйте все возможности: от генерации кода до работы с вашими проектами.
Почему стоит попробовать прямо сейчас?
⚡️ Пока есть возможность бесплатного доступа — используйте её! Это отличный шанс оценить, насколько AI может ускорить вашу работу с кодом.
🔥 Поставьте 50 реакций на этот пост — и я начну делать серию материалов о том, как я применяю нейронные сети в работе и повседневной жизни! Покажу реальные кейсы, которые упрощают рутину и экономят часы времени.
🗽Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥45❤🔥8🐳7 2 2
🧠 Obsidian + нейронка — ваш личный второй мозг:
Каждый раз, когда открываешь нейронку — она тебя не помнит. Ни задач, которые ты уже решал, ни ошибок, на которых набивал шишки. Каждый раз с чистого листа.
А если дать ей память? Обсидиан + нейронка решают эту проблему раз и навсегда.
Идея простая: накапливаешь свою базу знаний в Obsidian → потом нейронка работает уже на основе твоего контекста.
Как это выглядит в жизни:✅
1️⃣ База знаний по работе Ведёшь рабочий дневник. Описываешь задачи: что за задача, как подошёл, с чем столкнулся, как решил. Через месяц у тебя не "ну я вроде что-то похожее делал", а конкретная точка входа.
🔵 Кейс 1 — ты помнишь, что что-то похожее уже решал, но не помнишь где. Спрашиваешь нейронку: «Я что-то подобное делал, помоги найти». Бам — находит.
🔵 Кейс 2 — хочешь понять, что можно автоматизировать в своей работе. Говоришь: «Посмотри всё, что я делал. Найди слабые места. Что можно ускорить и улучшить?» И получаешь реальный разбор, а не общие советы из интернета.
2️⃣ Личная база знаний (не рабочая) Ведёшь дневник, записываешь что читал, как питался, что смотрел, что думал. Потом спрашиваешь: «Хочу улучшить свою продуктивность — посмотри мои заметки и предложи, что поменять». Нейронка знает твою ситуацию, а не абстрактного человека из интернета.
Почему Obsidian, а не просто папка с файлами?✅
Там можно удобно строить связи между заметками. Вы сами настраиваете, что с чем связано — нейронка потом ориентируется в этой структуре и выдаёт релевантные ответы, а не гадает по куче разрозненных файлов.
Ещё один крутой кейс — добавление нового материала✅
Поработал с новым материалом, прочитал статью, прошёл кусок курса. Говоришь нейронке: «Вот новый материал. Проанализируй мою базу знаний и предложи, куда это вписать, с чем это связать». Она сама найдёт нужные заметки и покажет, как это встраивается в то, что ты уже знаешь.
Это работает для чего угодно: аналитика, английский язык, питание, саморазвитие — масса применений.
Чтобы разобраться с Obsidian с нуля, я уже писал об этом статью — вот ссылка: [Obsidian]
🔥 Набираем 70 реакций на этот пост — и готовлю новый огненный пост про использования нейронок
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Каждый раз, когда открываешь нейронку — она тебя не помнит. Ни задач, которые ты уже решал, ни ошибок, на которых набивал шишки. Каждый раз с чистого листа.
А если дать ей память? Обсидиан + нейронка решают эту проблему раз и навсегда.
Идея простая: накапливаешь свою базу знаний в Obsidian → потом нейронка работает уже на основе твоего контекста.
Как это выглядит в жизни:
Почему Obsidian, а не просто папка с файлами?
Там можно удобно строить связи между заметками. Вы сами настраиваете, что с чем связано — нейронка потом ориентируется в этой структуре и выдаёт релевантные ответы, а не гадает по куче разрозненных файлов.
Ещё один крутой кейс — добавление нового материала
Поработал с новым материалом, прочитал статью, прошёл кусок курса. Говоришь нейронке: «Вот новый материал. Проанализируй мою базу знаний и предложи, куда это вписать, с чем это связать». Она сама найдёт нужные заметки и покажет, как это встраивается в то, что ты уже знаешь.
Это работает для чего угодно: аналитика, английский язык, питание, саморазвитие — масса применений.
Чтобы разобраться с Obsidian с нуля, я уже писал об этом статью — вот ссылка: [Obsidian]
🔥 Набираем 70 реакций на этот пост — и готовлю новый огненный пост про использования нейронок
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥46🐳5❤🔥2 2 1
Накодил обновления на двух сайтах:
• 📚 Сайт с базой знаний: dima-sqlit.ru
• 🎓 Сайт с менторством: mentor.dima-sqlit.ru
• Переделал дизайн, подчистил интерфейс, сделал приятнее глазу.
• Добавил статьи с разбором базовых вопросов на собеседованиях — всё на сайте.
Прошу вас: 👇
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥21 10 7🔥4 2 1
🗂 Skill для аналитиков: один файл — и нейронка всегда знает, как ты работаешь
Есть штука, которую используют единицы, хотя она реально экономит время — скилл.
Что это такое технически? Обычный Markdown-файл с YAML-заголовком (frontmatter):
Как вызвать скилл? Два способа:
• 🤖 Автоматически — в поле description прописываешь триггер: «используется когда автор пишет про документацию». Нейронка сама подхватит
• ✋ Вручную — просто говоришь: «Используй скилл X, у меня вот такая задача». Я сам обычно так и делаю
Где это реально полезно в аналитике:
1️⃣ Документация Прописал раз: как оформлять описание таблиц, метрик, дашбордов. Теперь нейронка всегда пишет в твоём стиле — не нужно каждый раз объяснять структуру
2️⃣ Стиль кода Описал: функции оформляй так, комментарии — вот так, если код идёт в репозиторий — добавляй докстринги. Всё. Получаешь консистентный код без лишних правок
3️⃣ Шаблоны SQL-запросов Хочешь, чтобы запросы всегда были в определённом стиле: алиасы, форматирование, комментарии к сложной логике? Один скилл — и это работает по умолчанию
Как создать скилл под себя? Не нужно ничего писать вручную с нуля. Просто даёшь нейронке контекст: что хочешь автоматизировать, как это должно работать, примеры. Она сама создаст скилл. Быстро и под твои задачи.
❗️ Важно: не используй готовые скиллы из интернета без проверки — там может быть вредоносный код. Из проверенных могу рекомендовать скилл superpowers — разберём его подробно в одном из следующих постов.
Важно понимать: Скилл даёт скелет — хорошую базу. Но проверять логику, дополнять деталями и «доводить до ума» всё равно нужно самому. Нейронка пока не знает нюансов твоего проекта лучше тебя.
Итог:🤩
🔥 Ставим 70 реакций на этот пост — и делаю разбор скилла superpowers.
📤 Пересылай пост коллеге или другу из аналитики — это бесплатно и помогает каналу расти. Спасибо!
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Есть штука, которую используют единицы, хотя она реально экономит время — скилл.
Что это такое технически? Обычный Markdown-файл с YAML-заголовком (frontmatter):
---
name: my_skill
description: Используется когда нужно написать документацию к коду
---
# Инструкция
[здесь твои правила и примеры]
Нейронка читает его автоматически и сразу понимает контекст. Больше ничего объяснять не нужно.
Как вызвать скилл? Два способа:
• 🤖 Автоматически — в поле description прописываешь триггер: «используется когда автор пишет про документацию». Нейронка сама подхватит
• ✋ Вручную — просто говоришь: «Используй скилл X, у меня вот такая задача». Я сам обычно так и делаю
Где это реально полезно в аналитике:
Как создать скилл под себя? Не нужно ничего писать вручную с нуля. Просто даёшь нейронке контекст: что хочешь автоматизировать, как это должно работать, примеры. Она сама создаст скилл. Быстро и под твои задачи.
❗️ Важно: не используй готовые скиллы из интернета без проверки — там может быть вредоносный код. Из проверенных могу рекомендовать скилл superpowers — разберём его подробно в одном из следующих постов.
Важно понимать: Скилл даёт скелет — хорошую базу. Но проверять логику, дополнять деталями и «доводить до ума» всё равно нужно самому. Нейронка пока не знает нюансов твоего проекта лучше тебя.
Итог:
🔥 Ставим 70 реакций на этот пост — и делаю разбор скилла superpowers.
📤 Пересылай пост коллеге или другу из аналитики — это бесплатно и помогает каналу расти. Спасибо!
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥38❤🔥6🐳4
Trino — это не база данных. Это распределённый SQL-движок, который подключается к десяткам источников: PostgreSQL, ClickHouse, Hive, S3 и другим. У него есть свои ресурсы (воркеры, память, CPU), но хранить данные он не умеет — он их берёт из источников и обрабатывает у себя.
И вот здесь начинаются сюрпризы.
Когда Trino выполняет запрос к внешнему источнику, в идеале он должен «протолкнуть» (push down) часть работы прямо туда: фильтры, агрегации, лимиты. Тогда источник вернёт уже обработанный результат — маленький и быстрый.
Но pushdown не всегда работает. Это зависит от конкретного коннектора, версии Trino и сложности запроса. Если pushdown не сработал — Trino тащит всю таблицу к себе и фильтрует уже у себя в памяти. Например:
-- Trino может вытащить всю таблицу orders и только потом отфильтровать
SELECT *
FROM postgres.public.orders
WHERE created_at > '2024-01-01'
Хочешь точно знать, что происходит? Смотри EXPLAIN — в плане будет видно, пошёл ли фильтр в источник или Trino делает это сам.
system.query — это способ сказать Trino: «не думай сам, выполни этот SQL прямо в источнике и просто верни мне результат».
1️⃣ PostgreSQL — тяжёлый фильтр по индексу:
SELECT *
FROM TABLE(
postgres.system.query(
query => 'SELECT id, amount FROM orders WHERE created_at > ''2024-01-01'''
)
)
PostgreSQL выполнит запрос сам, использует свои индексы — и вернёт только нужные строки.
2️⃣ ClickHouse — агрегация на стороне источника:
SELECT *
FROM TABLE(
clickhouse.system.query(
query => 'SELECT event_date, count() FROM events GROUP BY event_date'
)
)
ClickHouse заточен под колоночные агрегации. Если делать GROUP BY в Trino поверх ClickHouse — он сначала вытащит все сырые строки. system.query оставляет агрегацию там, где ей место.
✅ Используй, если мысленно отвечаешь «да» хотя бы на один вопрос:
• «Я точно знаю, что эта логика быстрее выполнится в источнике» → используй
• «Таблица большая, а мне нужен маленький срез — и я не уверен, что Trino сам догадается» → используй
• «Я делаю агрегацию в ClickHouse и не хочу гонять миллионы строк» → используй
• «EXPLAIN показывает, что pushdown не работает» → используй
❌ Не используй, если:
• Нужно джойнить данные из разных источников — тут Trino незаменим, system.query не даст соединить PG и ClickHouse в одном запросе
• Запрос простой и ты уверен, что pushdown сработал
• Хочешь переносимый запрос без привязки к диалекту источника
Итог:
🔥 Набираем 70 реакций на этот пост — так я пойму, что стоит делать больше таких разборов.
📤 Пересылай пост коллеге или другу из аналитики — это бесплатно и помогает каналу расти. Спасибо!
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25 8❤🔥6
🎙 Иду на AHA'26 — и вам советую:
22 мая в Москве проходит AHA'26 — конференция для тех, кто работает с данными и AI. Решил пойти сам — и вот почему.
Там реально интересная программа: как компании проверяют идеи быстрее и дешевле, как строят AI-продукты, которые реально работают, как не утонуть в данных и доверять тому, что в них написано. Без воды — только практика от команд, которые уже это сделали.
Выступают ребята из Яндекса, Авиасейлс, Сбера, X5 Tech, ВкусВилла, Wildberries, Т-Банка и ещё десятков компаний. Это не те, кто рассказывает «как надо» в теории — это те, кто уже запустил и работает с этим каждый день.
Форматы:
• Офлайн — 39 900 ₽ (22 мая + онлайн-день 14 мая + записи на 6 месяцев)
• Онлайн — 19 900 ₽ (трансляции 14 и 22 мая + материалы на 6 месяцев)
🎁 Для подписчиков моего канала — скидка 10% по промокоду DSQLIT10 при регистрации на сайте.
👋 Если тоже идёте офлайн — пишите, возможно, пересечёмся
❔ Планируете идти? Офлайн или онлайн? Делитесь в комментариях!
22 мая в Москве проходит AHA'26 — конференция для тех, кто работает с данными и AI. Решил пойти сам — и вот почему.
Там реально интересная программа: как компании проверяют идеи быстрее и дешевле, как строят AI-продукты, которые реально работают, как не утонуть в данных и доверять тому, что в них написано. Без воды — только практика от команд, которые уже это сделали.
Выступают ребята из Яндекса, Авиасейлс, Сбера, X5 Tech, ВкусВилла, Wildberries, Т-Банка и ещё десятков компаний. Это не те, кто рассказывает «как надо» в теории — это те, кто уже запустил и работает с этим каждый день.
Форматы:
• Офлайн — 39 900 ₽ (22 мая + онлайн-день 14 мая + записи на 6 месяцев)
• Онлайн — 19 900 ₽ (трансляции 14 и 22 мая + материалы на 6 месяцев)
🎁 Для подписчиков моего канала — скидка 10% по промокоду DSQLIT10 при регистрации на сайте.
👋 Если тоже идёте офлайн — пишите, возможно, пересечёмся
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7 7❤🔥4 3🐳1
⚡️ Параллельные запросы в ClickHouse через Python — ускоряем выгрузку в разы:
Знакомая ситуация: нужно выгрузить данные за 30 дней, пишешь цикл, день за днём, и ждёшь 30 минут.
А можно запустить все запросы одновременно и получить результат в 5–10 раз быстрее.
Сегодня покажу, как это сделать на простом примере.
Что сделаем:
🟢 Напишем функцию, которая выгружает данные за один день из ClickHouse.
🟢 Запустим её для нескольких дат параллельно с помощью
🟢 Соберём все результаты в один
Разбор по шагам:
1️⃣ Функция для одного дня:
Создаём функцию
2️⃣ Запускаем параллельно:
Используем
Что происходит под капотом:
•
•
•
•
То есть
3️⃣ Собираем результаты:
🌟 Как это выглядит в консоли:
Итог:🤩
Как выбирать max_workers?
• Для тяжёлых запросов к БД: 3–5 воркеров
• Для лёгких API-запросов: 10–20 воркеров
• Начинайте с 3 и смотрите на нагрузку базы — ClickHouse может обрабатывать ограниченное число запросов одновременно
🚀 Работает не только с ClickHouse — PostgreSQL, MySQL, любые API. Паттерн универсальный.
🔥 Набираем 70 реакций на этот пост — так я пойму, что стоит делать больше таких разборов.
📤 Пересылай пост коллеге или другу из аналитики — это бесплатно и помогает каналу расти. Спасибо!
🚬 Вопросы, менторство, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Знакомая ситуация: нужно выгрузить данные за 30 дней, пишешь цикл, день за днём, и ждёшь 30 минут.
А можно запустить все запросы одновременно и получить результат в 5–10 раз быстрее.
Сегодня покажу, как это сделать на простом примере.
Что сделаем:
ThreadPoolExecutor.DataFrame.Разбор по шагам:
Создаём функцию
load_day — она принимает дату, делает запрос в ClickHouse и возвращает DataFrame:import clickhouse_connect
import pandas as pd
def load_day(date_str):
print(f' [{date_str}] → запрос начат')
client = clickhouse_connect.get_client(**CH_CREDS)
df = client.query_df(f"""
SELECT * FROM events
WHERE date = '{date_str}'
""")
client.close()
print(f' [{date_str}] → готово, строк: {len(df)}')
return df
Используем
ThreadPoolExecutor. Ключевой момент — функция начинает выполняться прямо в момент вызова submit():from concurrent.futures import ThreadPoolExecutor, as_completed
dates = ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04']
executor = ThreadPoolExecutor(max_workers=3)
tasks = {executor.submit(load_day, d): d for d in dates}
# ↑ вот здесь load_day УЖЕ запустилась в фоновом потоке
# submit() не ждёт результата — сразу возвращает "квитанцию" (Future)
# и цикл переходит к следующей дате
Что происходит под капотом:
•
submit(load_day, '2024-01-01') → поток 1 сразу побежал делать запрос в ClickHouse •
submit(load_day, '2024-01-02') → поток 2 сразу побежал, пока первый ещё работает •
submit(load_day, '2024-01-03') → поток 3 сразу побежал •
submit(load_day, '2024-01-04') → все 3 воркера заняты — ждёт в очередиТо есть
submit() — это как «отдать задание курьеру». Курьер побежал, а ты уже отдаёшь задание следующему. max_workers=3 — значит у тебя 3 курьера. Четвёртое задание ляжет на стол и подождёт, пока кто-то вернётся.as_completed отдаёт задачи по мере их завершения — какая первая закончилась, ту и получаем:results = []
for task in as_completed(tasks):
date = tasks[task]
try:
results.append(task.result())
print(f' {date} — результат получен ✅')
except Exception as e:
print(f' {date} — ошибка: {e} ❌')
executor.shutdown()
df = pd.concat(results, ignore_index=True)
print(f'Всего строк: {len(df)}')
[2024-01-01] → запрос начат ← воркер 1 стартовал
[2024-01-02] → запрос начат ← воркер 2 стартовал
[2024-01-03] → запрос начат ← воркер 3 стартовал
[2024-01-03] → готово, строк: 1200
2024-01-03 — результат получен ✅
[2024-01-04] → запрос начат ← воркер 3 освободился, взял 4-й день
[2024-01-01] → готово, строк: 980
2024-01-01 — результат получен ✅
...
Итог:
Как выбирать max_workers?
• Для тяжёлых запросов к БД: 3–5 воркеров
• Для лёгких API-запросов: 10–20 воркеров
• Начинайте с 3 и смотрите на нагрузку базы — ClickHouse может обрабатывать ограниченное число запросов одновременно
🚀 Работает не только с ClickHouse — PostgreSQL, MySQL, любые API. Паттерн универсальный.
🔥 Набираем 70 реакций на этот пост — так я пойму, что стоит делать больше таких разборов.
📤 Пересылай пост коллеге или другу из аналитики — это бесплатно и помогает каналу расти. Спасибо!
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33❤🔥5🐳5
Сегодня хочу познакомить вас с Олегом — аналитиком данных с 5+ лет в B2B и B2G-проектах. Работал с заказчиками от стартапов до госсектора, набил шишки на каждом этапе — от сбора требований до сдачи отчётов.
Рекомендую начать знакомство с постов:
1) Первый — как Олег попал в IT: от техподдержки охранной компании, через проваленное тестовое — до аналитика на реальных проектах. Мотивирует 🔥
2) Второй — история «Договорился и передоговорился»: заказчик согласовал объём, а потом пришёл с 300% дополнительных требований за те же деньги.
3) Третий — план канала на 2026 год, что Олег будет разбирать весь год и в какой последовательности — от Excel и SQL до Python, портфолио и продуктового мышления. Удобно, чтобы не пропустить что-то нужное
4) И много других интересных постов......
Если вам интересно:
• как устроена работа аналитика в B2B и B2G
• как выстраивать отношения с заказчиками и защищать свои границы
• как строить карьеру в IT с нуля — без нужного диплома и опыта
Подписывайтесь на «Data Дзен», чтобы не потерять
Please open Telegram to view this post
VIEW IN TELEGRAM
🤖 Сделал телеграм-бота за вечер — и вот зачем:
Раньше прикладывал материалы прямо в постах или комментариях.
Но когда материала становится больше — это неудобно: и вам лень искать по истории, и мне неудобно хранить.
Поэтому я сделал отдельного бота. Логично, удобно, по-человечески.
Как это работает — win-win для всех:🤯
1️⃣ Для вас — все материалы собраны в одном месте. Заходите в бот, тыкаете нужное, и оно сразу прилетает вам. Никакой беготни по постам.
2️⃣ Для меня — бот требует подписку на канал, и тем самым помогает мне наращивать аудиторию. Абсолютно бесплатно для вас — это просто подписка.
3️⃣ В будущем — возможно появятся платные материалы. Но пока две модели: совсем без подписки, или с подпиской. Всё прозрачно.
И да — написал этого бота за один вечер при помощи нейронок🌟
Это к тому, что AI уже сейчас позволяет создавать проекты, которые реально закрывают ваши задачи даже если вы не разработчик.🌟
Что уже есть в боте:🤛
Первые 5 каруселей по A/B тестам — уже там. Я давно хотел систематизировать для себя эту тему, и решил совместить полезное с приятным: делаю красивые слайды, которые коротко и понятно объясняют материал по AB-тестам.
Буду рад вашей обратной связи:
• Как работает бот?
• Нравится ли визуал и подача?
• Что непонятно или хочется доработать?
• Накиньте ваших реакций, чтобы понимать интересно вам такое или нет 🔥
А если вы хорошо шарите в A/B тестах и хотите помочь с материалом — вэлком в ЛС
Итог:🤩
• Если вам самим интересно внедрить AI — в работу, в личные проекты, или просто понять, что с этим вообще можно делать — могу проконсульровать (все индивидуально под ваш запрос).
• Ну или может быть вам нужно сделать какой-то аналогичны проект под ключ, также можете писать с вашими запросами, интересно и в эту тему развиваться.
🌟 Ссылка на бота (гоу тестировать): Бот_канала_dima_sqlit
🚬 Вопросы, менторство, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Раньше прикладывал материалы прямо в постах или комментариях.
Но когда материала становится больше — это неудобно: и вам лень искать по истории, и мне неудобно хранить.
Поэтому я сделал отдельного бота. Логично, удобно, по-человечески.
Как это работает — win-win для всех:
И да — написал этого бота за один вечер при помощи нейронок
Это к тому, что AI уже сейчас позволяет создавать проекты, которые реально закрывают ваши задачи даже если вы не разработчик.
Что уже есть в боте:
Первые 5 каруселей по A/B тестам — уже там. Я давно хотел систематизировать для себя эту тему, и решил совместить полезное с приятным: делаю красивые слайды, которые коротко и понятно объясняют материал по AB-тестам.
Буду рад вашей обратной связи:
• Как работает бот?
• Нравится ли визуал и подача?
• Что непонятно или хочется доработать?
• Накиньте ваших реакций, чтобы понимать интересно вам такое или нет 🔥
А если вы хорошо шарите в A/B тестах и хотите помочь с материалом — вэлком в ЛС
Итог:
• Если вам самим интересно внедрить AI — в работу, в личные проекты, или просто понять, что с этим вообще можно делать — могу проконсульровать (все индивидуально под ваш запрос).
• Ну или может быть вам нужно сделать какой-то аналогичны проект под ключ, также можете писать с вашими запросами, интересно и в эту тему развиваться.
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤🔥7🐳4 1 1
Ранее писал про то, как я был первый раз на матемаркетинге, вот здесь можно почитать про это.
Ну а сейчас напишу про мой первый раз на AHA
С кем удалось пообщаться и познакомиться:
•
•
•
•
•
Завёл кучу полезных контактов — это, пожалуй, одна из главных ценностей таких мероприятий.
Некоторые доклады послушаю в записи. Всё-таки доклад можно посмотреть потом, а живое общение — только в моменте. Поэтому ни о чём не жалею.
На фото — всё, что удалось натаскать со стендов. Смотрите сами
Итог:
❓ Были на AHA 2026? Что смогли забрать со стендов? Пишите в комментариях — может, пересечёмся на следующем мероприятии в Москве!
А пока хочу спросить: что хотите видеть дальше?
• 🔧 Техничку — SQL, особенности СУБД, Python
• 🏠 Материал про IT-ипотеку и ремонт (накопилось много — планирую начать писать про это)
• 👇Или предложите свою тему в комментах
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤🔥10 8
Вам знакома ситуация, когда - написал большой sql запрос для задачи, а потом заказчик говорит: «Покажи то же самое, но за прошлый квартал» ?
И вы начинаете искать дату по всему файлу. Находите все вхождения, правите — и где-то всё равно пропускаешь одно. Запрос считает не то.
В общем очень много рутины.
start_date = "2024-01-01"
discount_threshold = 0.10
WITH params AS (
SELECT
DATE '2024-01-01' AS period_start,
DATE '2024-03-31' AS period_end,
0.10 AS discount_threshold
),
big_orders AS (
SELECT
o.order_id,
o.amount,
o.discount
FROM orders o
CROSS JOIN params p
WHERE o.order_date BETWEEN p.period_start AND p.period_end
AND o.discount > p.discount_threshold
)
SELECT * FROM big_orders
Все параметры — в одном месте сверху. Поменял квартал один раз — везде пересчиталось.
CROSS JOIN здесь — это не страшно.
params возвращает одну строку.CROSS JOIN просто «прицепляет» эту строку к каждой строке основной таблицы.🔥 Набираем 70 реакций на этот пост, чтобы подобные посты выходили чаще
Итог:
🗂 Это один из тех приёмов, который занимает 10 секунд, но экономит кучу времени на поддержке запроса.
❓ А как вы решаете эту проблему — хардкодите или есть другой подход? Пишите в комментах!
📤 Пересылай пост коллеге или другу из аналитики — это бесплатно и помогает каналу расти. Спасибо!
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥65❤🔥17 9 3
🔐 SQL-инъекция — типы, примеры и защита: всё что нужно знать аналитику:
Один из вопросов, который может быть на собесе - это что такое "SQL-инъекция".
Давайте разберёмся, как обычно с кодом и без воды.
🟢 Как работает атака:
Бэкенд строит запрос прямо из того, что ввёл пользователь:
Кавычки вокруг ввода уже вшиты в шаблон кода. Злоумышленник вводит
Левая кавычка уже есть в шаблоне — злоумышленник дописывает только закрывающую
🟢 3 основных типа SQL-инъекций:
1️⃣ Классическая — результат виден прямо в ответе сайта. Самый простой случай как выше.
2️⃣ Слепая (Blind) — сайт не выводит данные, но страница реагирует по-разному. Злоумышленник добавляет условие через AND к рабочему запросу:
Если буква угадана →
По реакции страницы злоумышленник понимает верна ли буква — как игра «горячо-холодно». Перебирает символ за символом.
3️⃣ Через UNION — дописывает свой SELECT к оригинальному и вытаскивает данные из любой таблицы. Структуру БД знать заранее не нужно — она вытаскивается через
🟢 Как защититься:
Без защиты Python склеивает строку и отдаёт в БД целиком — данные и команды уже неразличимы:
С параметрами шаблон и данные уходят в БД раздельно:
БД сначала получает шаблон → разбирает и фиксирует структуру запроса. Потом получает данные — и воспринимает их только как текст для поиска. Апостроф внутри
🟢 Ответ на собесе — коротко:
Итог:🤩
❓ Спрашивали про SQL-инъекцию на вашем собесе? Пишите в комментарии!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.
🚬 Вопросы, менторство, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Один из вопросов, который может быть на собесе - это что такое "SQL-инъекция".
Давайте разберёмся, как обычно с кодом и без воды.
Бэкенд строит запрос прямо из того, что ввёл пользователь:
SELECT * FROM users
WHERE username = 'ВВОД' AND password = 'ВВОД';
Кавычки вокруг ввода уже вшиты в шаблон кода. Злоумышленник вводит
admin' -- и запрос превращается в:WHERE username = 'admin' --' AND password = '...';
Левая кавычка уже есть в шаблоне — злоумышленник дописывает только закрывающую
'. Она обрывает строку досрочно, -- превращает всё остальное в комментарий. Проверка пароля выброшена — вход открыт.SELECT * FROM products WHERE id = 1
AND SUBSTRING(password, 1, 1) = 'a'
Если буква угадана →
TRUE AND TRUE → товар найден → страница загрузилась Если не угадана → TRUE AND FALSE → товар не найден → страница пустаяПо реакции страницы злоумышленник понимает верна ли буква — как игра «горячо-холодно». Перебирает символ за символом.
information_schema, системный справочник который есть в каждой БД:-- Шаг 1: узнать все таблицы
' UNION SELECT table_name, null FROM information_schema.tables --
-- Шаг 2: узнать поля нужной таблицы
' UNION SELECT column_name, null FROM information_schema.columns
WHERE table_name = 'users' --
-- Шаг 3: вытащить данные
' UNION SELECT username, password FROM users --
Без защиты Python склеивает строку и отдаёт в БД целиком — данные и команды уже неразличимы:
# ПЛОХО
query = "SELECT * FROM users WHERE username = '" + username + "'"
С параметрами шаблон и данные уходят в БД раздельно:
# ХОРОШО
cursor.execute(
"SELECT * FROM users WHERE username = %s",
(username,)
)
БД сначала получает шаблон → разбирает и фиксирует структуру запроса. Потом получает данные — и воспринимает их только как текст для поиска. Апостроф внутри
admin' -- уже просто символ, а не SQL-синтаксис — структура зафиксирована и данные её изменить не могут.«SQL-инъекция — это вид атаки, когда пользовательский ввод попадает напрямую в строку SQL-запроса и исполняется как код. Защита — параметризованные запросы: шаблон и данные идут в БД раздельно, поэтому данные никогда не интерпретируются как SQL-команды.»
Итог:
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19❤🔥8 6🐳1 1 1
📊 SQL трюк — как добавить строку «Все категории» к любому отчёту через UNION ALL (ЧАСТЬ 1):
Ситуация, с которой многие сталкиваются на работе.
Давайте представим таблицу с продажами orders:
И нужно сделать отчёт по продажам, который будет показывать в разрезе категорий тотал продажи — и при этом должна быть отдельная категория, которая объединяла бы все остальные. Её как раз мы искусственно и добавим через
🟢 Шаг 1 — обычная разбивка по категориям:
Получаем это:
Хорошо, но итога по всем нет. Добавляем его через
🟢 Шаг 2 — добавляем строку «Все категории»:
Результат:
Второй запрос считает тотал по всей таблице, а в поле
Почему
В нашем случае дублей нет — строка
Так что
🟢 Бонус — строка с тоталом всегда внизу:
🟢 Хотите еще таких лайфхаков ?
🔥 Набираем 70 реакций на этот пост, чтобы подобные посты выходили чаще
Итог:🤩
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ А какие ещё задачи решаете через
✔️ Подпишитесь на канал, чтобы не пропустить следующие хаки.
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Ситуация, с которой многие сталкиваются на работе.
Давайте представим таблицу с продажами orders:
order_id | category | revenue
1 | Одежда | 1500
2 | Обувь | 1200
3 | Техника | 2500
4 | Одежда | 5500
.........
И нужно сделать отчёт по продажам, который будет показывать в разрезе категорий тотал продажи — и при этом должна быть отдельная категория, которая объединяла бы все остальные. Её как раз мы искусственно и добавим через
UNION ALL.SELECT
category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY category
Получаем это:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Техника | 2500 | 1
Хорошо, но итога по всем нет. Добавляем его через
UNION ALL.SELECT
category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY category
UNION ALL
SELECT
'Все категории' AS category,
SUM(revenue),
COUNT(order_id)
FROM orders
Результат:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Техника | 2500 | 1
Все категории | 10700 | 4
Второй запрос считает тотал по всей таблице, а в поле
category мы просто подставляем строку 'Все категории' — и она встаёт отдельной строкой в результате.Почему
UNION ALL, а не просто UNION?UNION под капотом делает сортировку и удаляет дубликаты — это лишняя работа для базы.UNION ALL просто склеивает результаты как есть, без лишних операций.В нашем случае дублей нет — строка
'Все категории' явно уникальна.Так что
UNION тут ни к чему, берём UNION ALL — он быстрее.WITH combined AS (
SELECT
category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY category
UNION ALL
SELECT
'Все категории',
SUM(revenue),
COUNT(order_id)
FROM orders
)
SELECT *
FROM combined
ORDER BY
CASE WHEN category = 'Все категории' THEN 1 ELSE 0 END,
category
🔥 Набираем 70 реакций на этот пост, чтобы подобные посты выходили чаще
Итог:
UNION ALL — поделитесь в комментариях!@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41❤🔥11🐳10
🏠 IT ипотека (Часть 1) — выбор города и района:
Решил задокументировать весь путь — от выбора места до финального результата. Это первый пост из серии, поехали.
Почему вообще купил и зачем именно сейчас:
Хотелось закрыть гештальт. Может, это и не самое выгодное финансовое решение, но психологически — точно правильное. Своя квартира = спокойствие (по крайней мере у меня так).
Почему не Москва:
Изначально хотел, конечно, Москву, но эту опцию быстро прикрыли и я не успел, но считаю, что IT ипотека на данный момент все равно один из самых привлекательных вариантов. Ну если не Москва, то ближайшее подмосковье подумал я и начал смотреть варианты, для меня основные параметры были это транспортная доступность и готовые варианты, чтобы быстро сделать ремонт и заехать. В итоге был выбран город Красногорск.
Что по итогу выбрал:
По итогу выбор пал на ЖК, который находится рядом с МЦД (в 10 минутах ходьбы). По отделке — это черновой вариант (стены и окна). White box оставались только трех-комнатные квартиры, что дорого и не ликвидно. Поскольку это черновой вариант решено было проектировать и разбираться во всем этом самостоятельно (благо есть знакомые и родственники с кем можно было советоваться). Подумал, что будет интересно под разобраться в этом (тем более по образованию я инженер-строитель) по этому в следующих постах буду рассказывать про ремонт, создание проекта, где я смог сэкономить и так далее.
🔥 Набираем 70 реакций на этот пост, чтобы посты про IT ипотеку выходили быстрее
Итог:🤩
❓ А как вы относитесь к Ипотеке?
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.
🚬 Вопросы, менторство, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Решил задокументировать весь путь — от выбора места до финального результата. Это первый пост из серии, поехали.
Почему вообще купил и зачем именно сейчас:
Хотелось закрыть гештальт. Может, это и не самое выгодное финансовое решение, но психологически — точно правильное. Своя квартира = спокойствие (по крайней мере у меня так).
Почему не Москва:
Изначально хотел, конечно, Москву, но эту опцию быстро прикрыли и я не успел, но считаю, что IT ипотека на данный момент все равно один из самых привлекательных вариантов. Ну если не Москва, то ближайшее подмосковье подумал я и начал смотреть варианты, для меня основные параметры были это транспортная доступность и готовые варианты, чтобы быстро сделать ремонт и заехать. В итоге был выбран город Красногорск.
Что по итогу выбрал:
По итогу выбор пал на ЖК, который находится рядом с МЦД (в 10 минутах ходьбы). По отделке — это черновой вариант (стены и окна). White box оставались только трех-комнатные квартиры, что дорого и не ликвидно. Поскольку это черновой вариант решено было проектировать и разбираться во всем этом самостоятельно (благо есть знакомые и родственники с кем можно было советоваться). Подумал, что будет интересно под разобраться в этом (тем более по образованию я инженер-строитель) по этому в следующих постах буду рассказывать про ремонт, создание проекта, где я смог сэкономить и так далее.
🔥 Набираем 70 реакций на этот пост, чтобы посты про IT ипотеку выходили быстрее
Итог:
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥76❤🔥8🐳8
📊 SQL трюк — как добавить строку «Все категории» к любому отчёту через ROLLUP (ЧАСТЬ 2):
В прошлом посте мы добавляли итоговую строку через UNION ALL — это рабочий метод, но есть способ элегантнее.
Знакомьтесь:
GROUP BY ROLLUP — встроенный механизм SQL для автоматических итогов.
🟢 Что такое ROLLUP на пальцах:
ROLLUP — это расширение GROUP BY, которое автоматически добавляет строки с агрегатными итогами. Вместо того чтобы писать второй запрос и клеить через UNION ALL — просто добавляем одно слово
🟢 Шаг 1 — пишем запрос с ROLLUP:
Результат:
Итоговая строка появилась автоматически, но в поле
🟢 Шаг 2 — заменяем NULL на «Все категории»:
Используем COALESCE, чтобы подменить NULL на читаемую метку:
Результат:
Чисто и лаконично — никакого второго запроса.
🟢 Важный момент — а что если в данных уже есть NULL в category?
Представим, что в таблице есть строки с незаполненной категорией:
Запускаем запрос с COALESCE — и получаем проблему:
COALESCE не различает: это NULL из данных или NULL от ROLLUP — он заменяет оба.
🟢 Решение — используем GROUPING():
Функция
Результат:
Теперь всё на своих местах.
🟢 Хотите еще таких лайфхаков ?
🔥 Набираем 70 реакций на этот пост, чтобы подобные посты выходили чаще
Итог:🤩
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ А знали про ROLLUP и GROUPING() раньше? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие хаки.
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
В прошлом посте мы добавляли итоговую строку через UNION ALL — это рабочий метод, но есть способ элегантнее.
Знакомьтесь:
GROUP BY ROLLUP — встроенный механизм SQL для автоматических итогов.
ROLLUP — это расширение GROUP BY, которое автоматически добавляет строки с агрегатными итогами. Вместо того чтобы писать второй запрос и клеить через UNION ALL — просто добавляем одно слово
SELECT
category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
Результат:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Техника | 2500 | 1
NULL | 10700 | 4
Итоговая строка появилась автоматически, но в поле
category стоит NULL — это сигнал ROLLUP, что строка является итогом по всей группе.Используем COALESCE, чтобы подменить NULL на читаемую метку:
SELECT
COALESCE(category, 'Все категории') AS category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
Результат:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Техника | 2500 | 1
Все категории | 10700 | 4
Чисто и лаконично — никакого второго запроса.
Представим, что в таблице есть строки с незаполненной категорией:
order_id | category | revenue
1 | Одежда | 1500
2 | Обувь | 1200
3 | NULL | 800 ← категория не указана
4 | Одежда | 5500
Запускаем запрос с COALESCE — и получаем проблему:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Все категории | 800 | 1 ← это был NULL из данных!
Все категории | 10700 | 4 ← это реальный итог ROLLUP
COALESCE не различает: это NULL из данных или NULL от ROLLUP — он заменяет оба.
Функция
GROUPING(column) возвращает 1, если строка итоговая (от ROLLUP), и 0 — если это обычная строка с NULL из данных:SELECT
CASE
WHEN GROUPING(category) = 1 THEN 'Все категории'
ELSE COALESCE(category, 'Не указана')
END AS category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
ORDER BY
GROUPING(category),
category
Результат:
category | total_revenue | orders_count
Не указана | 800 | 1 ← NULL из данных
Одежда | 7000 | 2
Обувь | 1200 | 1
Все категории | 10700 | 4 ← итог ROLLUP
Теперь всё на своих местах.
🔥 Набираем 70 реакций на этот пост, чтобы подобные посты выходили чаще
Итог:
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41❤🔥2🐳2 1 1
🤖 Что такое MCP — как дать нейросети доступ к вашим данным (часть 1):
Если вы уже работаете в Cursor, Claude Code, Codex, LM Studio или другой IDE где есть нейросети — вы наверняка встречали термин MCP. Разберем, что это и зачем нужно.
Что такое MCP?🎚
MCP (Model Context Protocol) — открытый стандарт, который позволяет ИИ-клиенту подключаться к внешним данным и системам через специальные инструменты — Tools.
Без MCP модель работает только с тем, что ты вставил ей в чат.
Хочешь узнать метрику из своей базы — скопировал данные вручную, вставил, получил ответ.
MCP убирает этот шаг: модель сама идет в твою базу, достает нужное и отвечает.
Вы просто спрашиваете.
Схема простая:
• MCP Клиент — ваша среда (Cursor, Claude Desktop, Codex, LM Studio и другие)
• MCP Сервер — ваш код с инструментами
• Tool — функция, которую модель вызывает сама, когда понимает что она нужна
Скиллы — это же то же самое?🎚
Нет, в одном из прошлых постов я разбирал, что такое skills — по сути это просто большой сохраненный промпт для повторяющихся задач.
Может показаться, что скилл умеет то же самое, что и mcp и возникает вопрос — зачем нужен mcp?
Можно ведь написать скилл, который запускает bash или Python.
Но вот в чём различия — это не скилл запускает скрипты.
Cursor и другие IDE сами имеют встроенные инструменты: запуск команд, чтение файлов, редактирование кода — они зашиты внутрь приложения, никак не связаны с MCP.
• Скилл — это промпт, который говорит модели «используй вот этот встроенный инструмент вот так».
• MCP — другая история. Вы пишете свой код и подключаете его через протокол. Теперь у модели есть инструмент, который делает ровно то, что вы закодили — без ограничений клиента.
Пишем свой MCP-сервер на Python:🎚
Библиотека
Прописываем сервер в
Пишете в чате: «Покажи продажи по Москве» — модель сама вызывает нужный инструмент.
🟢 Хотите еще про нейронки ?
🔥 Набираем 80 реакций на этот пост, чтобы подобные посты выходили чаще
Итог:🤩
На посты про MCP меня вдохновило вот это видео — рекомендую к просмотру для большего понимания.
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ Уже пробовал MCP если да, то какие? Делись в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие хаки.
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Если вы уже работаете в Cursor, Claude Code, Codex, LM Studio или другой IDE где есть нейросети — вы наверняка встречали термин MCP. Разберем, что это и зачем нужно.
Что такое MCP?
MCP (Model Context Protocol) — открытый стандарт, который позволяет ИИ-клиенту подключаться к внешним данным и системам через специальные инструменты — Tools.
Без MCP модель работает только с тем, что ты вставил ей в чат.
Хочешь узнать метрику из своей базы — скопировал данные вручную, вставил, получил ответ.
MCP убирает этот шаг: модель сама идет в твою базу, достает нужное и отвечает.
Вы просто спрашиваете.
Схема простая:
• MCP Клиент — ваша среда (Cursor, Claude Desktop, Codex, LM Studio и другие)
• MCP Сервер — ваш код с инструментами
• Tool — функция, которую модель вызывает сама, когда понимает что она нужна
Скиллы — это же то же самое?
Нет, в одном из прошлых постов я разбирал, что такое skills — по сути это просто большой сохраненный промпт для повторяющихся задач.
Может показаться, что скилл умеет то же самое, что и mcp и возникает вопрос — зачем нужен mcp?
Можно ведь написать скилл, который запускает bash или Python.
Но вот в чём различия — это не скилл запускает скрипты.
Cursor и другие IDE сами имеют встроенные инструменты: запуск команд, чтение файлов, редактирование кода — они зашиты внутрь приложения, никак не связаны с MCP.
• Скилл — это промпт, который говорит модели «используй вот этот встроенный инструмент вот так».
• MCP — другая история. Вы пишете свой код и подключаете его через протокол. Теперь у модели есть инструмент, который делает ровно то, что вы закодили — без ограничений клиента.
Пишем свой MCP-сервер на Python:
Библиотека
fastmcp делает это просто:from mcp.server.fastmcp import FastMCP
import sqlite3
mcp = FastMCP("WorkMetrics")
@mcp.tool()
def get_sales_by_region(region: str) -> list:
"""
Возвращает продажи по указанному региону за текущий месяц.
Используй когда пользователь спрашивает о продажах или
выручке по региону.
"""
conn = sqlite3.connect("metrics.db")
cursor = conn.cursor()
cursor.execute(
"SELECT date, revenue FROM sales WHERE region=?", (region,)
)
result = cursor.fetchall()
conn.close()
return result
if __name__ == "__main__":
mcp.run()
Прописываем сервер в
mcp.json — и всё.Пишете в чате: «Покажи продажи по Москве» — модель сама вызывает нужный инструмент.
🔥 Набираем 80 реакций на этот пост, чтобы подобные посты выходили чаще
Итог:
На посты про MCP меня вдохновило вот это видео — рекомендую к просмотру для большего понимания.
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥37❤🔥7🐳5 1 1
🏠 IT ипотека (Часть 2) — как я проектировал квартиру (Remplanner, Pinterest, ChatGPT):
Когда берёшь черновую квартиру — впереди не просто ремонт, а целый проект. Надо придумать планировку, расстановку мебели и понять, как это вообще будет выглядеть в натуре. Делюсь своим стеком инструментов которые я использовал.
🎚 Инструмент 1 — Remplanner:
Это был мой основной инструмент на этапе планировки квартиры.
Работает прямо в браузере — по сути autocad, но с большим количеством готовых инструментов и шаблонов.
Что я делал в Remplanner:
• Прорабатывал разные варианты планировки
• Расставлял мебель и проверял, насколько удобно всё помещается
• Планировал розетки, выключатели и освещение
• Смотрел, как будут выглядеть комнаты в 3D
• Формировал понятные чертежи для строителей
Самое полезное — можно быстро делать несколько вариантов и сравнивать их между собой. На бумаге многие идеи выглядят отлично, а в планировщике сразу становится видно, где не открывается шкаф, не проходит стол или остаётся слишком узкий проход.
В итоге ещё до начала ремонта понимаешь, как будет выглядеть квартира и избегаешь части дорогих переделок.
🎚 Инструмент 2 — Pinterest:
Это этап «насмотренности».
Работает так:
• Вбиваете запрос: например, «квартира 45 кв», «скандинавский стиль серый» — и просто смотришь
• Постепенно понимаешь, что тебе нравится, а что нет
• Сохраняешь понравившееся → вырисовывается общее направление
Повторить всё один в один с Pinterest не получится — дорого или нереализуемо. Но это и не нужно. Важно сформировать своё видение.
🎚 Инструмент 3 — ChatGPT:
Когда стены уже возведены — делаешь фотографию реального пространства и загружаешь в ChatGPT. Дальше:
• «Хочу здесь поставить диван, что посоветуешь?»
• «Как можно оформить этот угол?»
• «Что сюда органично впишется по цвету?»
ChatGPT накидывает варианты прямо под ваш конкретный интерьер (приложил пример, как я подбирал кухню).
🔥 Набираем 70 реакций на этот пост, чтобы посты про IT ипотеку выходили быстрее
Итог:🤩
❓ Чем пользовались при ремонте или перестановке? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.
🚬 Вопросы, менторство, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Когда берёшь черновую квартиру — впереди не просто ремонт, а целый проект. Надо придумать планировку, расстановку мебели и понять, как это вообще будет выглядеть в натуре. Делюсь своим стеком инструментов которые я использовал.
Это был мой основной инструмент на этапе планировки квартиры.
Работает прямо в браузере — по сути autocad, но с большим количеством готовых инструментов и шаблонов.
Что я делал в Remplanner:
• Прорабатывал разные варианты планировки
• Расставлял мебель и проверял, насколько удобно всё помещается
• Планировал розетки, выключатели и освещение
• Смотрел, как будут выглядеть комнаты в 3D
• Формировал понятные чертежи для строителей
Самое полезное — можно быстро делать несколько вариантов и сравнивать их между собой. На бумаге многие идеи выглядят отлично, а в планировщике сразу становится видно, где не открывается шкаф, не проходит стол или остаётся слишком узкий проход.
В итоге ещё до начала ремонта понимаешь, как будет выглядеть квартира и избегаешь части дорогих переделок.
Это этап «насмотренности».
Работает так:
• Вбиваете запрос: например, «квартира 45 кв», «скандинавский стиль серый» — и просто смотришь
• Постепенно понимаешь, что тебе нравится, а что нет
• Сохраняешь понравившееся → вырисовывается общее направление
Повторить всё один в один с Pinterest не получится — дорого или нереализуемо. Но это и не нужно. Важно сформировать своё видение.
Когда стены уже возведены — делаешь фотографию реального пространства и загружаешь в ChatGPT. Дальше:
• «Хочу здесь поставить диван, что посоветуешь?»
• «Как можно оформить этот угол?»
• «Что сюда органично впишется по цвету?»
ChatGPT накидывает варианты прямо под ваш конкретный интерьер (приложил пример, как я подбирал кухню).
🔥 Набираем 70 реакций на этот пост, чтобы посты про IT ипотеку выходили быстрее
Итог:
@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥37❤🔥11🐳8