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

📩 По менторству и сотрудничеству: @catdem
Download Telegram
🔥 GitHub Copilot Pro за 400 рублей: доступ к GPT-5 mini с unlimited запросами для IT, аналитики, разработки и повседневной жизни:

Если вы работаете в IT — будь то программирование, аналитика данных, системное администрирование или другие направления — GitHub Copilot Pro может стать вашим суперпомощником. Сегодня разберём, как купить подписку дёшево, что она даёт и почему это выгодно для повседневных задач. Я расскажу на простых примерах, чтобы было понятно даже тем, кто только начинает.

1️⃣ Цены на подписку:
400 рублей за месяц или 830 за три месяца (купить можно на plati market):
• 1 месяц за 400 рублей — отлично для теста, чтобы понять, как инструмент вписывается в ваш workflow
• 3 месяца за 830 рублей — выгоднее в долгосрочной перспективе, около 277 рублей в месяц

2️⃣ Что позволяет подписка:
• Доступ к GPT-5 mini с unlimited запросами — генерируйте код, SQL-запросы, аналитику и т.д. сколько угодно, без ограничений.
• Copilot Pro интегрирует мощный ИИ в вашу среду разработки (VS Code)
• Всего 300 премиум-запросов в месяц на топовые модели (claude, gemini, gpt), но для рутинных задач mini-версии более чем достаточно.
• Одна из ключевых фич — автодополнение кода в реальном времени: пока вы печатаете, ИИ предлагает готовые строки или блоки кода, которые идеально вписываются в ваш стиль.
• Ещё круче — понимание контекста проекта: ИИ анализирует все файлы, структуру кода и зависимости, чтобы давать персонализированные предложения. Не просто общий ответ, а такой, который учитывает вашу библиотеку (например, Pandas для аналитики) или настройки (типа Airflow для задач).

Важно сказать, что для работы требуется VPN

3️⃣ Если вам интересна тема ИИ, можете посмотреть предыдущие посты на эту ему:
Бесплатные нейросети для аналитики и кода
Вайбкодинг — бесплатный аналог Cursor AI от Alibaba (Qoder)
Бесплатная нейросеть от Google для работы с любыми материалами — NotebookLM
Как за 400 рублей в год получить доступ к Claude, ChatGPT, Gemini и Grok через Perplexity и без использования VPN

Итог:
GitHub Copilot Pro — универсальный инструмент для IT-специалистов (и не только), ускоряющий задачи в программировании, аналитике и за её пределами.

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

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

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1266
🧐 Временные таблицы (TEMP TABLE) vs Материализованные представления (MATERIALIZED VIEW) в SQL — простое объяснение: что это такое и в чём разница? Часть 2.

Продолжаем разбираться с временными конструкциями в SQL.
Первую часть можно посмотреть вот здесь


Многие путают временные таблицы (TEMP TABLE) и материализованные представления (MATERIALIZED VIEW), потому что оба хранят данные физически. Но временные таблицы — для сеанса, а материализованные — как кэш с обновлениями. Давайте разберём их работу на таблице sales из первой части.

Представим, что у нас в базе данных есть таблица sales (продажи в магазине):
id | user_id     | product   |  amount  |     date
1 | 101 | Кофе | 500 | 2025-01-15
2 | 102 | Чай | 300 | 2025-01-16
3 | 101 | Печенье | 200 | 2025-01-17
4 | 103 | Кофе | 500 | 2025-01-18


1️⃣ Что такое временные таблицы (TEMP TABLE)?

Временная таблица — это реальная таблица, которая создаётся на время сеанса и хранит данные физически. Она исчезает автоматически при закрытии сеанса (что такое сеанс описано в первой части). Полезна для промежуточных расчётов с большими данными.

Пример временной таблицы:
-- Создаём временную таблицу
CREATE TEMP TABLE temp_sales AS
SELECT * FROM sales WHERE amount > 300;

-- Используем в сеансе
SELECT user_id, SUM(amount) FROM temp_sales GROUP BY user_id; -- Работает

-- Новый сеанс — исчезла
SELECT * FROM temp_sales; -- Ошибка!


2️⃣ Что такое материализованные представления (MATERIALIZED VIEW)?

Материализованное представление — это VIEW, которое хранит данные физически, как таблица, но обновляется по расписанию или вручную. В отличие от обычного VIEW, оно не пересчитывается каждый раз — данные "заморожены" до обновления. Полезно для тяжёлых отчётов.

Пример материализованного VIEW (в PostgreSQL, например):
-- Создаём материализованное VIEW
CREATE MATERIALIZED VIEW mat_user_summary AS
SELECT user_id, COUNT(*) as order_count, SUM(amount) as total_spent
FROM sales GROUP BY user_id;

-- Используем как таблицу
SELECT * FROM mat_user_summary WHERE total_spent > 400; -- Быстро, данные из кэша

-- Обновляем данные
REFRESH MATERIALIZED VIEW mat_user_summary; -- Пересчитывает


3️⃣ В чём разница между временными таблицами и материализованными VIEW?

• Хранение: Оба физически, но временные — только в сеансе, материализованные — постоянно, с обновлениями.
• Создание: TEMP TABLE для сеанса, MATERIALIZED VIEW для долгосрочного кэша.
• Обновление: Временные таблицы не обновляются автоматически (данные статичны после создания; для изменений нужно вручную обновлять их содержимое, например, через INSERT/UPDATE). Материализованные — вручную по команде (REFRESH) или через триггеры/расписания в некоторых СУБД.

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

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

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

@dima_sqlit
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥1364🐳3
🤩 Как отслеживать прогресс цикла в 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
❤‍🔥39🔥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