Дима SQL-ит 🧑‍💻 (Аналитика данных)
1.18K subscribers
10 photos
1 video
56 links
👨‍💻 Блог аналитика данных в IT

📩 По менторству и сотрудничеству: @catdem
Download Telegram
🤩 Как отслеживать прогресс цикла в Python — от простых print до tqdm:

Многие новички (и не только) в Python сталкиваются с длинными циклами — например, при обработке больших данных или вычислениях.
Возникает вопрос — завис ли процесс? Можно, конечно, проставлять print с номером итерации, но это примитивно и неудобно.

Есть крутое решение — библиотека tqdm, которая добавляет стильный прогресс-бар.
Представим, что у нас есть список из 100 элементов, и мы хотим мониторить цикл for.

1️⃣ Простой способ — print с номером итерации:
import time  # Для имитации задержки

items = range(100) # 100 элементов

for i in items:
print(f"Обработка элемента {i}") # Выводит номер каждый раз
time.sleep(0.1) # Имитация работы


Это базовый вариант — вставляем print внутри цикла, чтобы видеть, на каком шаге мы. Полезно для отладки, но консоль быстро замусоривается, и нет информации о времени или скорости.

2️⃣ Лучшее решение — библиотека tqdm:
import time  # Для имитации задержки
from tqdm import tqdm # Импортируем tqdm

items = range(100) # 100 элементов

for item in tqdm(items, desc="Обработка элементов"):
time.sleep(0.1) # Имитация работы (0.1 секунды на итерацию)

print("Цикл завершён!")


Tqdm — это лёгкая библиотека, которая оборачивает ваш цикл в прогресс-бар с процентами, скоростью (итераций в секунду) и временем до завершения.
Устанавливается просто:
pip install tqdm


3️⃣ Как работает? При запуске в консоли появляется прогресс-бар вроде:
Обработка элементов:  42%|████▏     | 42/100 [00:04<00:06,  9.50it/s]


Итог:
Если цикл короткий — хватит print. Но для серьёзных задач используйте tqdm.

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

А вы отслеживаете прогресс в Python-циклах? Использовали tqdm или другие библиотеки? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤‍🔥76
🤩 Копируем данные из DataFrame к себе в буфер обмена без лишних шагов с сохранением файлов:

Аналитики часто сталкиваются с задачей — нужно быстро скопировать данные из DataFrame в Excel или наоборот, без лишних сохранений в файлы. Pandas предлагает удобные инструменты для работы с буфером обмена:

1. Вставка из буфера обмена (загрузка данных):🔙
df = pd.read_clipboard()  # создаем DataFrame из скопированных данных

Работает с таблицами из Excel, браузера и других источников. 

2. Копирование в буфер обмен (выгрузка данных):🔜
df.to_clipboard()  # копируем DataFrame в буфер обмена

Теперь данные можно вставить в Excel или другую программу обычным Ctrl+V.

Я работаю в jupyter notebook на удаленном сервере и я встретился с ошибкой:
Pyperclip could not find a copy/paste mechanism for your system.....

И что теперь делать ? Можно конечно установить Pyperclip к себе в систему на удаленном сервере, но для этого, как правило нужны права супер пользователя (sudo), а мы работаем в большой компании и нам никто не даст этого сделать. Я нашел выход (смотрим пункт 3).

3. Копирование в буфер обмен на удаленном сервере (выгрузка данных):🔜

Установим библиотеку copydf
pip install copydf

Импортируем функцию copyDF и в качестве аргумента дадим ей на вход наш Pandas DataFrame:
from copydf import copyDF

copyDF(df)


Готово — теперь данные можно вставить в Excel или другую программу обычным Ctrl+V.

Итог:
Pandas clipboard — удобная штука для локальной работы, но на серверах можно встретиться с проблемами.
copydf решает проблему без прав и лишних заморочек
Попробуйте — и забудьте о файлах!

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Пользуетесь clipboard в Pandas? Сталкивались с проблемами на удаленных серверах? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21❤‍🔥7421
😭 Как загружать данные из CSV, Excel или Pandas DataFrame во временные таблицы ClickHouse:

Работая с ClickHouse, часто сталкиваешься с ситуацией: тебе дали список из десятков тысяч user_id или сотен городов, и нужно отфильтровать данные по ним. Но часто возникают проблемы следующего характера:
❗️ Нет прав на создание таблиц (даже временных)
❗️ Подставлять всё через IN (...) в запрос через f строку — не вариант: СУБД ругается на длину запроса
✔️ Выход есть — внешние временные таблицы через ExternalData!

1️⃣Что понадобится?

• Устанавливаем библиотеку (если ещё не стоит):
pip install clickhouse-connect pandas


• Импортируем нужное:
import clickhouse_connect
import pandas as pd
from clickhouse_connect.driver.external import ExternalData


• Подключаемся к ClickHouse (настройки у всех разные, но вот пример подключения):
def get_click_dl_client():
client = clickhouse_connect.get_client(
host='host',
port=8443,
username='your_login',
password='your_password',
secure=True,
verify=False,
send_receive_timeout=6000000
)
return client

client = get_click_dl_client()


2️⃣ Сценарий (у нас два файла):

1) users.csv — содержит user_id (int) и флаг actual (String: «да»/«нет»)
2) city.xlsx — список городов в колонке city (String)
Нам нужно отобрать user_id только с actual = 'да' и только из указанных городов.

• Загружаем данные через ExternalData
Создаём объект — он будет "контейнером" для наших временных таблиц:
ext_data = ExternalData()


• Вариант 1: Прямая загрузка из CSV-файла
ext_data.add_file(
file_name='user_table_tmp', # имя таблицы в SQL-запросе
fmt='CSVWithNames', # Формат с именами столбцов в первой строке (если без имён — используйте 'CSV')
structure=['user_id Int32', 'actual String'], # Структура - типы полей
data=open('users.csv', 'rb').read() # путь к файлу (строка!)
)


• Вариант 2: Загрузка из Pandas DataFrame (из Excel):
city_df = pd.read_excel('city.xlsx')  # Читаем Excel в DataFrame

ext_data.add_file(
file_name='city_table_tmp', # имя таблицы в SQL-запросе
fmt='CSVWithNames', # С именами столбцов
structure=['city String'], # Структура - типы полей
data=city_df.to_csv(index=False).encode('utf-8') # Конвертируем DF в CSV-строку и в байты для передачи
)

Здесь .to_csv() превращает DataFrame в CSV-строку, а .encode('utf-8') — в байты для ExternalData.

• Теперь используем в запросе — без прав на создание таблиц в БД!
q = '''
SELECT
user_id,
SUM(money_spend) AS total_spend
FROM events
WHERE
1=1
AND user_id IN (SELECT user_id FROM user_table_tmp WHERE actual='да')
AND city IN (SELECT city FROM city_table_tmp)
GROUP BY 1
'''

df_total_spend = client.query_df(q, external_data=ext_data) # Выполняем с внешними данными


Итог:
ExternalData — супер-способ обойти отсутствие прав на temp tables в ClickHouse. Загружайте из файлов или DataFrame и джойньте/фильтруйте на здоровье!

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

А вы сталкивались с ограничениями на IN или отсутствием прав в ClickHouse? Как решали? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤‍🔥64🐳31
🤔 Claude Sonnet 4.5 от Anthropic вышла пару дней назад:

Обновлённая модель, заточенная под кодинг, создание агентов и сложные вычисления. По бенчмаркам, она лидирует в некоторых задачах, обходя GPT-5 и Gemini 2.5 Pro. По моему личному опыту эта моделька лучше всего отвечает на мои запросы ну и еще Grok, как по мне хорош.

Хочу в ближайшие дни протестировать ее и написать проекты. Интересно ваше мнение, какие модельки вы используете и могут ли они уже помочь написать полноценный проект?

Не хочу перегружать вас бенчмарками и прочими умными словами, просто интересно ваше мнение, хотели бы такие посты, где я бы оповещал вас о новых инструментах, как в ИИ, так и в целом мире IT, что думаете? 🤩

попробовать можно здесь

Итог:
Модель выглядит многообещающей для нашей работы с данными — быстрее, умнее в кодинге и с лучшей поддержкой инструментов. Буду разбираться!

🍸 Если пост полезен, накидывайте реакций, чтобы я понимал, что тема интересна!
❤️ Поддержать канал бустами (бесплатно с Telegram Premium) можно здесь: t.me/boost/dima_sqlit

Вы уже тестили Claude Sonnet 4.5? Как впечатления — лучше ли она в кодинге/аналитике по сравнению с GPT или Gemini? И как вам такая рубрика: интересно ли быть в курсе ИИ-новостей и чтобы я на канале их рассказывал? Может быть интересно, как я применяю ИИ в работе/жизни и т.п.? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤‍🔥32
😱 Важность типов данных в SQL: почему данные не джойнятся, функции не применяются:

Аналитики часто сталкиваются с ситуациями, когда SQL-запросы дают неожиданные результаты — таблицы не джойнятся, функции не работают или сравнения ломаются. Всё это из-за несоответствия типов данных полей: строка не склеивается с числом, дата не сравнивается с текстом. Особенно это актуально для JOIN, где типы должны идеально совпадать. Давайте разберём на простых примерах, почему типы данных — это основа стабильных запросов, и как с этим работать.

Представим две таблицы в базе: orders (заказы) и customers (клиенты).
Вот их структура с данными: 😐

Таблица orders:

| id (INT) | customer_id (VARCHAR) | amount (DECIMAL) | order_date (DATE) |
|----------|-----------------------|------------------|-------------------|
| 1 | '101' | 500.00 | 2025-10-01 |
| 2 | '102' | 300.00 | 2025-10-02 |
| 3 | '101' | 200.00 | 2025-10-03 |


Таблица customers:

| id (INT) | name (VARCHAR) | join_date (VARCHAR) |
|----------|----------------|---------------------|
| 101 | Ваня | '2025-09-01' |
| 102 | Таня | '2025-09-15' |


Обратите внимание: customer_id в orders — VARCHAR, а id в customers — INT. Это классическая ловушка!

1️⃣ Проблемы с JOIN: несоответствие типов приводит к пустым результатам
Если типы не совпадают, SQL может не найти совпадений, даже если значения выглядят одинаково. Например, '101' (строка) не равно 101 (число) без явного приведения:


Плохой пример (JOIN не сработает):
SELECT o.id, c.name, o.amount
FROM orders o
JOIN customers c ON o.customer_id = c.id; -- Нет совпадений! Результат пустой


Почему?
• Поле "o.customer_id" — VARCHAR('101'),
• Поле "c.id" — INT(101).
SQL сравнивает типы строго.

Решение: Приведите типы с CAST.
Хороший пример:
SELECT o.id, c.name, o.amount
FROM orders o
JOIN customers c ON CAST(o.customer_id AS INT) = c.id; -- Теперь джойнится: Ваня с заказами 1 и 3


2️⃣ Функции не применяются: математические операции и агрегаты ломаются на "чужих" типах
Функции вроде MAX, SUM, AVG и другие ожидают конкретные типы:


Представим столбец amount как VARCHAR в таблице test_amounts:
| amount (VARCHAR) |
|------------------|
| '10' |
| '2' |
| '100' |


Плохой пример:
SELECT MAX(amount) FROM test_amounts;  -- Возвращает '2', потому что лексикографически '2' > '10' > '100' (сравнивает по символам)


Решение: Приведите к числу.
SELECT MAX(CAST(amount AS DECIMAL)) FROM test_amounts;  -- Возвращает 100, как ожидается


Итого:
Типы данных — фундамент SQL. Несоответствия приводят к пустым джойнам, ошибкам функций и неверным расчётам. Всегда анализируйте типы заранее, приводите их явно. Это сэкономит часы отладки!

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Сталкивались с проблемами из-за типов данных в JOIN или функциях? Какие типичные ошибки встречали? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥292❤‍🔥1🐳1
Привет!
Хочу сегодня поделиться каналом Натальи, где она рассказывает свой путь самостоятельного развития от инженера-конструктора на заводе до senior data scientist в крупном банке.
Она может:
рассказать, какие скиллы реально нужны в работе
рассказать, что делать чтобы вашу работу не заменил ИИ
подсказать, как проходить собеседования в ML/DSs,
поделиться опытом работы дата саентистом в бигтех компании
пошутить и повеселиться

Если думаете, куда развиваться в сфере Data Science — очень советую заглянуть к ней в канал
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥922
📱 Как забирать данные из Google Sheets по API через Python:

Сегодня покажу, как за 10-15 минут настроить доступ к Google Sheets через API и загрузить данные прямо в Pandas.

Что сделаем:
1️⃣ Зарегистрируем Gmail и создадим проект в Google Cloud Console.
2️⃣ Включим Sheets API и сгенерируем JSON-ключ для аутентификации.
3️⃣ Добавим сервис-аккаунт в права доступа к вашей таблице.
4️⃣ Установим gspread и pandas, напишем скрипт для загрузки данных в DataFrame.

Зачем это нужно?
🔥 Это поможет для простой аналитики личных расходов или быстрых бизнес-запросов
Легко стройте базовую аналитику: фильтры, join'ы и графики для бюджета или метрик бизнеса.

Приятного чтения

😢 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥20🔥14🐳411
🍌 Здоровье в IT: как я поддерживаю свое ментальное состояние. Часть 2 — про Менталку:

Привет! В прошлой части я рассказал про БАДы для борьбы с сидячим образом жизни, а сегодня, пока я нахожусь в родном крае и вдали от московской суеты, решил поделиться, как поддерживаю голову в тонусе. Работа за компом — это не только тело, но и мозг. Я стараюсь держать баланс, чтобы не скатиться в выгорание. Расскажу про свои приёмы — они простые, но реально работают. Но помните, это только мои личные наблюдения и у вас может быть по другому!

Мой топ-3 для менталки:
1️⃣ Смена обстановки: Я стараюсь уезжать из Москвы хотя бы раз в месяц — на пару дней в родной край или куда-то за город. Это даёт ощущение спокойствия, замедляет время: можно подышать другим воздухом, подумать о целях, мечтах и пути без отвлекающих уведомлений. Если у вас нет возможности рвануть в другой город (финансы, работа), попробуйте просто выбираться в другую часть своего города — в парк, на набережную или в тихий район. Даже полчаса свежего воздуха и новой обстановки придают новые силы: мозг перезагружается, и вам сразу становится лучше.
2️⃣ Оффлайн-общение и смена контекста: Больше говорите с людьми не через экран! В крупных городах полно конференций, митапов или просто сходок по IT/хобби — идите, заводите новые знакомства. Я раньше думал: "Надо сесть и решать задачу до победного", но на деле, когда застрял, лучше отвлечься. Переключаешься на разговоры — и бац, решение приходит само, как по волшебству. Новые люди дают свежие идеи, а общение оффлайн снижает стресс и добавляет энергии. Не бойтесь "потерять время" на это — оно окупается.
3️⃣ Чтение книг: Найдите то, что цепляет именно вас — классика вроде Достоевского, нон-фикшн по психологии/бизнесу или биографии крутых личностей (типа Илона Маска или Стива Джобса). Я стараюсь читать по 20-30 минут перед сном — это помогает отвлечься от кода, найти вдохновение и новые инсайты. Книги как терапия: развивают эмпатию, дают паузу от рутины и мотивируют на изменения. Главное — не заставлять себя, а выбрать жанр, который заинтересует.

Итог: 🤩
Менталка в IT — это не роскошь, а необходимость, чтобы не выгорать. Для меня смена обстановки, живое общение и книги — как перезагрузка мозга: дают силы, ясность и радость. Попробуйте внедрить хотя бы один хак — начните с прогулки в парк. Но если чувствуете, что нужна помощь, обратитесь к специалисту — психолог, психотерапевт или коуч лучше подскажут персонально.

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

А как вы поддерживаете ментальное здоровье? Уезжаете ли из города, общаетесь оффлайн или читаете книги? Что помогает от выгорания — или может, у вас свои секреты? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥18🔥156
Повышаем продуктивность в Jupyter Notebook - мой личный топ горячих клавиш:

Jupyter Notebook — мощный инструмент, но его горячие клавиши могут ускорить рутину в разы.
Важно знать: в Jupyter есть два режима работы с ячейками:

🛑 Command mode (неактивный, когда ячейка выбрана, но курсор в ней не активен)
🛑 Edit mode (активный, когда ячейка выбрана и курсор в ней активен)

Разберём топ-комбинации для Command mode:
1️⃣ A (Англ.) — Создаёт новую ячейку выше текущей. Идеально, когда нужно вставить блок перед существующим кодом — без копирования.
2️⃣ B (Англ.) — Создаёт новую ячейку снизу от текущей. Новая пустая ячейка, а не копия — быстро расширяй ноутбук.
3️⃣ M (Англ.) — Переключает ячейку в markdown-режим (текстовый). Здесь пишешь форматированный текст, заголовки или объяснения. (Markdown — это простой язык разметки, рекомендую освоить: он супер полезен для документации кода и отчётов.)
4️⃣ Y (Англ.) — Переключает ячейку в code-режим (код).
5️⃣ X (Англ.) — Вырезает выделенную ячейку (или блок ячеек) и копирует в буфер — для перемещения в другое место.
6️⃣ C (Англ.) — Копирует выделенную ячейку.
7️⃣ V (Англ.) — Вставляет скопированную/вырезанную ячейку (из пункта 4 или 5) снизу от текущей.
8️⃣ D, D (двойное нажатие D) — Удаляет текущую ячейку.
9️⃣ Z (Англ.) — Отменяет удаление ячейки. Ошибся с D, D? Один клик — и всё на месте.
1️⃣0️⃣ Ctrl + Enter — Выполняет текущую ячейку без перехода к следующей.
1️⃣1️⃣ Shift + Enter — Выполняет текущую ячейку с переходом к следующей.

🔜 Бонус:
Выделение нескольких ячеек для массовых действий
• Shift + ↑ / ↓ — Зажмите Shift и жмите стрелки вверх/вниз, чтобы быстро выделить блок ячеек. Теперь комбинируйте с другими шорткатами:
— Выделите группу и нажмите D, D — удалите все сразу.
— Или Ctrl + Enter — запустите весь блок без перехода.
Это удобно для чистки или тестирования цепочек кода в больших ноутбуках.

Также, вы, можете ознакомиться с другими горячими клавишами, которые работают не только в jupyter notebook — об этом я писал пост вот здесь

Итого:
Это был топ моих горячих клавиш в Jupyter — от создания ячеек до редактирования кода. Начните с A/B/M и этим, вы, уже сэкономите много времени.

😢 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Какие шорткаты в Jupyter знаете, вы? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤‍🔥6🐳31
🤨 Сводные таблицы в SQL: простой способ с CASE WHEN:

Сводные таблицы — это трюк в SQL, чтобы собрать данные в компактный вид. Вместо того чтобы показывать каждую запись отдельно, вы делаете колонки из категорий (например, из месяцев или кварталов). Так отчёт становится короче и проще для чтения. Сегодня разберём самый простой метод с CASE WHEN — он работает везде, без сложностей. Покажу на примере продаж в магазине.

Что такое сводная таблица на пальцах:
Представьте: у вас есть список заказов, где каждый заказ — отдельная строка. В сводной таблице вы группируете по клиенту и показываете суммы по кварталам в колонках (Q1, Q2 и т.д.). Вместо 6 строк на двух клиентов — всего 2 строки, где всё видно сразу.

Пример: таблица заказов
Вот исходная таблица Orders (продажи за год):
| customer_id | quarter | order_amount |
|-------------|---------|--------------|
| 101 | Q1 | 5000 |
| 101 | Q2 | 7000 |
| 101 | Q3 | 6000 |
| 102 | Q1 | 3000 |
| 102 | Q2 | 4500 |
| 102 | Q4 | 5500 |


Теперь задача: для каждого клиента показать сумму по кварталам в колонках.

Как это сделать шаг за шагом:
• Группируем по клиенту: GROUP BY customer_id — чтобы данные по каждому клиенту были в одной строке.
• Создаём колонки с CASE WHEN: Для каждого квартала проверяем "если это Q1, то суммируем сумму заказа, иначе 0". SUM() посчитает итог.

Вот полный запрос:
SELECT  
customer_id,
SUM(CASE WHEN quarter = 'Q1' THEN order_amount ELSE 0 END) AS q1_sales,
SUM(CASE WHEN quarter = 'Q2' THEN order_amount ELSE 0 END) AS q2_sales,
SUM(CASE WHEN quarter = 'Q3' THEN order_amount ELSE 0 END) AS q3_sales,
SUM(CASE WHEN quarter = 'Q4' THEN order_amount ELSE 0 END) AS q4_sales
FROM Orders
GROUP BY customer_id
ORDER BY customer_id;


Что получится:
| customer_id | q1_sales | q2_sales | q3_sales | q4_sales |
|-------------|----------|----------|----------|----------|
| 101 | 5000 | 7000 | 6000 | 0 |
| 102 | 3000 | 4500 | 0 | 5500 |


Теперь по клиенту 101 всё в одной строке: видно, что в Q4 он не покупал. Легко сравнить!

Итог:
CASE WHEN — это лёгкий способ сделать сводную таблицу.

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Пробовали сводные таблицы? Что считали — продажи или что-то другое? Делитесь в комментах!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29❤‍🔥15🐳6
🖥 Что значит data-driven и почему профессия — Аналитика никогда не устареет:

Сегодня хочу разобраться, зачем вообще нужна аналитика данных и почему компании готовы платить за неё хорошие деньги. Всё дело в подходе, где решения принимаются на основе реальных цифр, а не наугад или по интуиции.

Такой подход называется data-driven — когда данные ведут бизнес вперёд, помогая находить способы быстро заработать больше. Без аналитики и метрик (это просто измеримые показатели, как счётчик продаж или сколько людей уходит с сайта) вы не поймёте, что работает, а что нет. Давайте разберём по полочкам простыми словами.

🤩 Что значит data-driven подход?
Data-driven — это когда компания смотрит на факты из данных, чтобы решать, что делать дальше. Вместо "давайте запустим эту рекламу, потому что мне нравится" — "давайте проверим цифры и увидим, принесёт ли она клиентов". Это снижает ошибки, ускоряет рост и даёт преимущество. Например, в Netflix аналитики изучают, какие фильмы люди досматривают, и рекомендуют похожие — из-за этого пользователи остаются дольше и платят больше. Без такого подхода бизнес как в тумане: ты не знаешь, почему продажи падают или клиенты уходят.

🤩 Зачем нужны метрики?
Метрики — это простые цифры, которые показывают, как идёт дело: сколько людей купило товар (конверсия), сколько клиентов ушло (отток) или сколько денег вернулось от вложений (возврат инвестиций). Есть старая мудрость: "То, что измеряешь, то и улучшаешь" — без цифр ты не видишь проблем и не можешь их исправить. Метрики помогают:
🛑 Найти слабые места: Если цифры показывают, что половина людей бросает покупку на последнем шаге (это как воронка продаж — процесс от просмотра до оплаты), то можно понять, в чём дело — может, форма оплаты слишком сложная?
🛑Проверить идеи: Запусти два варианта рекламы и сравнить, какая даёт больше кликов.
🛑Планировать будущее: Посчитать, сколько в среднем клиент потратил за год, чтобы понять, стоит ли тратить на него рекламу.

😺 Почему аналитикам платят хорошо?
Аналитик — это человек, который копается в данных и находит "золотые" идеи для роста бизнеса. Представь: ты смотришь на процесс продаж и видишь, что 40% людей уходят перед оплатой. Добавляешь быструю кнопку "оплатить в один клик" — и продажи растут на 20%. При большом трафике это может дать миллионы рублей за месяц!

Итог:
Data-driven подход и метрики — это основа для умных решений в бизнесе, а аналитика остаётся вечной профессией, потому что данные всегда будут генерироваться, а компании — искать способы роста

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

А вы используете data-driven в вашей работе или только сейчас узнали о таком подходе ?
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21❤‍🔥7🐳6
🤫 Как посчитать медиану в SQL — разберем задачу с собеседования:

На собеседованиях аналитиков часто спрашивают про медиану: "Как её посчитать в SQL без встроенных функций?" Это классика, потому что проверяет понимание сортировки, оконных функций и логики. Сегодня разберём всё по полочкам — от теории до кода.

Сначала разберём, что такое медиана и зачем она нужна: 😁

Что такое медиана — это значение, которое находится посередине в отсортированном массиве чисел. Давайте разберём пару примеров, и вам сразу всё станет ясно.
• Представим массив чисел [5, 3, 1, 10, 8]. Давайте его отсортируем по возрастанию чисел [1, 3, 5, 8, 10] смотрим, какое значение находится посередине списка — правильно, это число 5. Отлично, мы нашли медиану.
• Что если в массиве данных чётное количество чисел, например [5, 3, 1, 10, 8, 1]. Так, давайте отсортируем [1, 1, 3, 5, 8, 10] видим, что середина находится между 3 и 5, тогда остаётся взять среднее между этими числами: (3+5)/2 = 4. Супер, разобрались, как находить медиану в чётных и нечётных массивах!

Теперь давайте разберёмся, а зачем вообще нужна медиана? 💁‍♂

Представим, что мы хотим посчитать ЗП IT-компании, например, и у нас есть вот такие данные: [100тыс, 150тыс, 130тыс, 120тыс, 1млн]. Мы видим, что 1млн рублей выделяется из списка — давайте попробуем посчитать среднее и медиану и увидим, какая разница между ними?
Среднее: (100тыс + 150тыс + 130тыс + 120тыс + 1млн)/5 = 300тыс.
Медиана: отсортировано [100тыс, 120тыс, 130тыс, 150тыс, 1млн] — центральное 130тыс.

Вывод: медиана более точно отображает ситуацию, так как 1млн получает директор компании. Именно по этому и нужна медиана — она устойчива к выбросам, в отличие от среднего. Всё зависит от конкретной ситуации, и лучше считать сразу среднее и медиану, отталкиваясь от смысла данных. В аналитике медиана спасает в зарплатах, ценах на жильё или времени доставки — там, где есть аномалии.

Научимся находить медиану в SQL: 😏

• Рассмотрим таблицу зарплат с чётным числом записей (6 сотрудников).
employee_id | salary
------------|----------
1 | 100000
2 | 150000
3 | 130000
4 | 120000
5 | 1000000
6 | 110000


• Пишем sql запрос:
WITH ranked AS (
SELECT
salary,
ROW_NUMBER() OVER (ORDER BY salary) AS rn,
COUNT(*) OVER () AS total_count
FROM salaries
)
SELECT AVG(salary) AS median
FROM ranked
WHERE rn IN (
FLOOR((total_count + 1) / 2.0),
CEIL((total_count + 1) / 2.0)
);


• Посмотрим, что делает CTE:
salary  | rn | total_count
--------|----|-----------
100000 | 1 | 6
110000 | 2 | 6
120000 | 3 | 6
130000 | 4 | 6
150000 | 5 | 6
1000000 | 6 | 6


• Посмотрим, что делают FLOOR и CEIL:
FLOOR((total_count + 1) / 2.0) = FLOOR((6 + 1) / 2.0)  = FLOOR(3.5) = 3 (округление вниз)

CEIL((total_count + 1) / 2.0) = CEIL((6 + 1) / 2.0) = CEIL(3.5) = 4 (округление вверх)


• Значит, мы берём строки с номерами 3 и 4:
salary  | rn
--------|----
120000 | 3 ← берём
130000 | 4 ← берём


• Мы взяли строки с rn=3 и rn=4:
Результат:
----------------------------------------------------------------------
median = AVG(120000, 130000) = (120000 + 130000) / 2 = 250000 / 2 = 125000


Итог:

Медиана устойчива к выбросам, а в SQL её легко посчитать через CTE с ROW_NUMBER.

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Использовали медиану в SQL? Для каких метрик — зарплаты, продажи или что-то другое? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥38🔥203
🤔 Принцип "явное лучше чем не явное" в жизни, работе, sql, python:

Выражение "явное лучше чем не явное" ("Explicit is better than implicit") — одна из основных заповедей Zen of Python, которая применима не только к коду.
Давайте разберем этот принцип на простых примерах:

Примеры в SQL: 🛑

Неявное (плохо): непонятно, откуда поле
SELECT 
employee_id,
employee_name,
department_name,
salary
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

Проблема: В SELECT не указано, из какой таблицы берутся столбцы employee_id, employee_name, department_name и salary — из employees или из departments? Читающему код приходится тратить время на изучение схемы БД, чтобы понять источник каждого поля и избежать ошибок в интерпретации.

Явное (хорошо): понятно с первого взгляда
SELECT 
e.employee_id,
e.employee_name,
d.department_name,
e.salary
FROM employees AS e
INNER JOIN departments AS d ON e.department_id = d.department_id;

Почему лучше:
• Сразу видно: employee_id и salary из таблицы employees (алиас e), а department_name из departments (алиас d)
• Через полгода коллега (или ты сам) откроешь этот запрос и не потеряешь время на разбор
• и т.д.

Примеры в Python: 🛑

Неявное (плохо): непонятно, что на входе и выходе
def calculate_conversion(users, converted):
return converted / users

Проблемы:
• Что такое users и converted? Int, float, или может быть список?
• Что возвращает функция? Float или int?
• Что делать, если users = 0? Будет деление на ноль.
• Нет документации — коллега не поймет, как использовать.

Явное (хорошо): типы и документация
def calculate_conversion(users: int, converted: int) -> float:
"""
Рассчитывает конверсию пользователей.

Args:
users (int): Общее количество пользователей (должно быть > 0).
converted (int): Количество конвертированных пользователей.

Returns:
float: Конверсия в долях (например, 0.05 для 5%).

Raises:
ValueError: Если users <= 0.

Example:
>>> calculate_conversion(1000, 50)
0.05
"""
if users <= 0:
raise ValueError("Количество пользователей должно быть больше 0")

return converted / users

Почему лучше:
• Type hints (users: int, -> float): Сразу видно, какие типы ожидаются и что вернется. IDE подсветит ошибки, если передашь строку вместо int
• Docstring: Полное описание — что функция делает, какие аргументы, что возвращает, какие исключения. Тот, кто использует твою функцию, не имеет вопросов по ее использованию.
• Валидация входных данных: Явно проверяем users > 0, чтобы не словить деление на ноль.
• Пример использования: Коллега может скопировать и сразу запустить.

Итог:
Явный подход в коде, SQL-запросах и целом в жизни — это основа.
Явное лучше неявного, потому что это экономит время, устраняет недопонимания и делает все проще.

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Что думаете об этом подходе (знали о нем или нет) ? Делитесь опытом в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥13🔥6🐳522
🧠 GPT-5.1 (Polaris Alpha) — новая топовая LLM модель (и её можно попробовать бесплатно):

Сейчас в комьюнити активно обсуждают новую модель Polaris Alpha. Многие уже шепчутся, что это "по ощущениям как GPT-5.1" — и, честно, после тестов я понимаю, откуда этот хайп.

Самое главное: её уже можно нормально потестить бесплатно через OpenRouter. Если вы работаете с данными, кодом, текстами или готовитесь к собесам — очень рекомендую не затягивать.

Почему Polaris Alpha меня впечатлила: 🔵
• Очень точно понимает формулировки задач
• Отлично держит контекст
• Хорошо пишет технический контент: SQL, Python, аналитика
• Следует стилю
• и т.п.

Где попробовать: 🔵
Polaris Alpha доступна через OpenRouter, вот ссылка на модель

Совет от меня: 🔵
Не ограничивайтесь "дай мне код".
Попросите:
• разобрать ваши SQL-запросы
• переписать посты под ваш стиль
• сгенерировать кейсы под собесы
• объяснить сложную тему простым языком.
По таким задачам лучше всего видно, насколько модель "понимает, что вы от неё хотите".

Итог:

🍸 Если такой формат разборов про ИИ-модели вам заходит — дайте знать реакциями, буду делиться новыми находками.
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Уже пробовали Polaris Alpha или другие модели через OpenRouter? Какие впечатления? Пишите в комментариях.
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.


Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳13🔥8❤‍🔥6
🖥 SQL-фишки — которые выведут (Junior / Middle / Senior) аналитиков на новый уровень:

Запросы в SQL бывают громоздкими (много условий в блоке where, много полей в блоке select), а отладка — сплошная головная боль. Сегодня разберем два простых трюка, которые позволят отлаживать и писать код гораздо быстрее:

1️⃣ Фишка №1 (WHERE 1=1 — комментируй фильтры без ошибок):

Условие 1=1 — это всегда "правда".
Добавим в начало WHERE, и все условия дальше пишем через AND.
Закомментируем любое — синтаксис не сломается.

🔵 Рассмотри пример кода с фишкой:
SELECT
order_id,
amount
FROM orders
WHERE
1=1
AND amount > 1000 -- опечатка: amount, не mount
AND order_date >= '2025-01-01'
AND status = 'completed';


🔵 Вдруг нужно убрать условие "amount > 1000" — просто закомментируем:
SELECT
order_id,
amount
FROM orders
WHERE
1=1
-- AND amount > 1000 -- убрали, и всё ок
AND order_date >= '2025-01-01'
AND status = 'completed';

Запрос будет работать, а если бы не было условия 1=1, то так бы сделать не получилось.

2️⃣ Фишка №2 (Запятые слева перед названием полей в SELECT):

Фишка заключается в том, что ставить запятую нужно слева от каждого поля после первого, чтобы тоже было удобно комментировать код.

🔵 Рассмотри пример кода с фишкой:
SELECT
order_id
, customer_id
, order_date
, amount
FROM orders
WHERE 1=1
AND order_date >= '2025-01-01';


🔵 Попробуем убрать customer_id:
SELECT
order_id
-- , customer_id -- закомментировали, запятая ушла
, order_date
, amount
FROM orders
WHERE 1=1
AND order_date >= '2025-01-01';

Всё хорошо — получаем результат без ошибок.

Итог:
WHERE 1=1 и запятые слева в SELECT — фишки, которые ускоряют работу с SQL в разы. Попробуйте внедрить к себе эти фишки и вы заметите, как начали быстрее писать код.

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Используете эти приёмы? Или есть свои для отладки? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41❤‍🔥11🐳3
This media is not supported in your browser
VIEW IN TELEGRAM
Привет!
Как аналитик данных, я часто взаимодействую с дата-инженерами: они строят витрины, настраивают пайплайны для данных и помогают с инфраструктурой, а иногда приходится самому разбираться в ETL-процессах. 🤩

Поэтому хочу посоветовать канал @etl_kitchen от Руслана — практика с большим опытом в Дата-Инженерии. Он собирает открытую базу знаний, где собирает гайды и туториалы по популярным технологиям — https://etl-kitchen-book.ru

А в своем канале он делится полезными гайдами, например: 👀
1️⃣ Как поставить Airflow за 15 минут к себе на компьютер
2️⃣ Как читать и анализировать запросы через EXPLAIN и EXPLAIN ANALYZE
3️⃣ Что такое Docker простыми словами
4️⃣ Рассказал, что такое dbt и как он изучал его
5️⃣ Рассказал про бесплатный сервис, который поможет вам понять, что такое API

😋 Помимо технических гайдов, он любит готовить. Можете приготовить по его рецептам:
1️⃣ Блины с ветчиной и сыром за 30 минут
2️⃣ Вкуснейший наполеон
3️⃣ На ужин можно приготовить - курицу на игле

Рекомендую подписаться на его канал, там еще много интересного 😨
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥964
🗒 Как посчитать произведение в SQL, если есть только SUM — разберем задачу с собеседования:

Иногда на собеседовании спрашивают:
"Вот у тебя есть таблица транзакций за день. Для каждого дня посчитай произведение значений. Что будешь делать?"

Это решается чисто через математику и стандартные агрегаты. Сейчас разберёмся по шагам.

Представим таблицу transactions:
| tx_date    | value |
|------------|-------|
| 2025-10-01 | 2 |
| 2025-10-01 | 3 |
| 2025-10-01 | 5 |
| 2025-10-02 | 4 |
| 2025-10-02 | 2 |


Задача: для каждого дня посчитать произведение всех value.
То есть:
• для 2025-10-01 должно получиться 2⋅3⋅5=30
• для 2025-10-02 должно получиться 4⋅2=8
Как из суммы сделать произведение? 🧠

Вспоминаем школьную математику:
• log(a⋅b)=log(a)+log(b)

Переводя на человеческий язык, чтобы получить произведение, можно:
• взять логарифм каждого числа
• сложить
• применить экспоненту и получить итоговый результат

Решение в SQL 🔵
SELECT
tx_date,
EXP(SUM(LN(value))) AS product_value
FROM transactions
GROUP BY tx_date
ORDER BY tx_date;


Что тут происходит:
• LN(value) — считаем натуральный логарифм каждого значения.
• SUM(LN(value)) — агрегируем по дню.
• EXP(...) — возвращаемся из логарифмического мира к исходному числу.
В итоге получаем то самое произведение.

Важные нюансы, о которых любят спрашивать 🧐
1️⃣Нули:
• Если есть хотя бы один 0, то произведение за день должно быть 0.
• Но ln(0) не существует — будет ошибка.
• Как обойти:
— либо заранее проверять наличие нулей
— либо аккуратно обрабатывать условием

2️⃣Отрицательные значения:
• ln(x) определён только для x>0.
• Если в данных возможны отрицательные значения — задача усложняется:
— нужно отдельно считать знак (чётность количества отрицательных)
— логарифм брать от модуля
— восстанавливать знак в конце.
• На собеседованиях чаще всего ожидают решение для положительных чисел и аккуратную оговорку про этот кейс — если вы про него скажете, это плюс.

Итог:
Такое решение показывает на собеседовании не только знание SQL, но и умение опираться на математику и аккуратно думать про крайние случаи — нули и отрицательные значения.

🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Сталкивались с задачами на "продвинутые" агрегаты в SQL (медиана, произведение, перцентили)? Пишите в комментариях, что вызывало сложности — постараюсь разобрать в следующих постах.
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🐳943❤‍🔥22
📚 Бесплатные материалы для изучения статистики и проведения A/B тестов:

В одном из постов у меня спросили про изучения статистике, есть много платных и бесплатных материалов и как правило бесплатные материалы ничем не уступают платным.

Я собрал видеокурсы и книги, которые можно найти в интернете абсолютно бесплатно и делюсь с вами, чтобы вы могли себе сохранить этот список:

Видеокурсы (видеоматериалы): 🔵
1) Основы статистики Ч.1 и Основы статистики Ч.2
2) Бесплатный курс «Основы статистики и A/B-тестирования»
3) Интенсив A/B Week от Яндекса
4) Вероятность и статистика с Глебом Михайловым
5) Введение в статистику от SophiStat
6) Прикладная статистика от Академии Аналитиков Авито

Книги: 🔵
1) Владимир Савельев — Статистика и котики
2) Дарелл Хафф — Как лгать при помощи статистики
3) Эндрю Сигел — Практическая бизнес-статистика
4) Чарльз Уилан — Голая стаистика
5) Сара Бослаф — Статистика для всех

Итог:

🍸 Если хотите, чтобы я собрал аналогичную подборку по Python, SQL или другим темам, напишите об этом в комментариях!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Пользовались какими-то из этих материалов? Что бы добавили в подборку?
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤‍🔥27🔥841
💯 SQL-лайфхаки — номера в GROUP BY и как избежать целых чисел в расчётах при делении:

Группировка в SQL: по именам и по номерам столбцов 🔵
В SQL при группировке часто повторяешь длинные названия столбцов. Можно проще — использовать номера столбцов из списка SELECT.

Пример с именами столбцов:
SELECT order_date, customer_city, COUNT(*)
FROM orders
GROUP BY order_date, customer_city


То же самое с номерами столбцов:
SELECT order_date, customer_city, COUNT(*)
FROM orders
GROUP BY 1, 2 -- 1 и 2 — это первый и второй столбцы в SELECT

Так код короче и удобнее править, особенно если поле одно или много.

Правильное деление: избегаем целочисленного деления 🔵
SQL часто делит целые числа и отбрасывает дроби — 5/2 = 2, а не 2.5. Чтобы получить правильный процент, нужно привести числитель или знаменатель к дробному типу.

Способы:
• Умножить числитель на 100.0 (не на 100, а именно с точкой)
• Привести к float (через CAST)

Пример:
SELECT
category,
SUM(sales) AS total_sales,
SUM(sales) * 100.0 / SUM(all_sales) AS percent -- 100.0 заставит SQL считать дроби
FROM sales
GROUP BY category


Или через CAST:
SELECT
category,
SUM(sales) AS total_sales,
CAST(SUM(sales) * 100 AS DECIMAL(5,2)) / SUM(all_sales) AS percent
FROM sales
GROUP BY category


Итог:
Группировка по номерам столбцов (GROUP BY 1, 2) и явное указание дробного типа при делении (100.0 вместо 100 или через CAST) — два простых приёма, которые экономят время и избавляют от ошибок. Номера столбцов делают код компактнее и удобнее для правок, а правильное деление гарантирует точные проценты и метрики.

🍸 Если зашло, кидайте реакции — пойму, что SQL-трюки нужны!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)

Знали об этих приёмах раньше или только сейчас узнали? Используете GROUP BY с номерами в работе? Делитесь опытом в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥29🐳53❤‍🔥1