Мир аналитика данных
4.6K subscribers
139 photos
3 videos
114 links
Пишу о рабочих буднях аналитика. Тут много рабочего кода, прохождение собеседований и еще много всего полезного.
https://www.linkedin.com/in/valeriashuvaeva
Автор канала: @Valeria_Shuvaeva
Download Telegram
🎓 Продвинутая аналитика Яндекс.Метрики для маркетологов — теперь бесплатно на Stepik!

Ровно год назад я вынашивала идею: а можно ли поиграться с Яндекс.Метрикой, не создавая полноценный сайт? 📊
Ответ нашёлся — можно! Я прикрутила счётчик к каналу на Дзене и начала изучать поведение пользователей прямо оттуда: сколько людей пришли, что читали, какие статьи заходят лучше всего.

➡️Об этом я подробно писала в посте:

А теперь хочу поделиться крутым бесплатным курсом, который отлично дополнит этот опыт.

👨‍🏫 Друг моего друга запустил курс на Stepik: "SQL для маркетинга. Продвинутая аналитика данных Яндекс.Метрики".
Да, бесплатно, да, полезно, да, от души — таких инициатив всегда хочется поддержать ❤️

Если вы работаете с метрикой, хотите прокачать SQL именно под задачи анализа трафика, понимать поведение пользователей и строить крутые отчёты — загляните. Уверена, вам понравится!

📌 Учим тут https://stepik.org/course/192052
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥28🔥186🥰3👍1
Удалёнка — кайф или кому как? 🧳🏡

На днях подписчик попросил рассказать про удалёнку — мол, есть ли у меня пост на эту тему. Кажется, я как-то упоминала, что работаю удалённо, но без подробностей, как к этому пришла. А тут и правда есть о чём подумать.

Когда-то мне искренне нравился офис: обеды в кафешках с коллегами 🍝, кофе-брейки ☕️, живые разговоры, лица в метро, смена обстановки, движ — всё это давало ощущение движения, жизни, причастности.

Но как только появилась возможность быть ближе к детям — забирать их из школы 🏫, готовить дома 🍳, водить на кружки 🎨 — я даже не сомневалась. Удалёнка — это просто спасение для родителей. Реально шик, топ, красота!

Иногда скучаю по «поболтать с коллегами в кафешке». Но сейчас это как бизнес-класс — красиво, но мимо.

Удалёнка — не универсальный кайф, но для меня в этом этапе жизни — это то, что нужно.

💬 Кто-то обожает полный ремоут. Кто-то прётся от офисной движухи.

А вы как работаете? Какой ритм вам комфортен? А может у вас гибрид?
11🔥6
«Я в режиме реального времени поясняла структуру запросов / ответов в Postman и разбирала документацию в Swagger», — пишет аналитик, который прошел наш курс, а потом два технических собеседования в международные компании. Приятно, конечно ❤️

Если в 2025 году вы хотите:
— научиться выбирать стиль интеграции под вашу задачу;
— начать проектировать с нуля и описывать интеграции в современных стилях (API: REST, SOAP, gRPC и других, + брокеры сообщений);
— узнать как правильно собирать требования и моделировать в UML;
— подготовиться к собеседованию, решив более 100 заданий;
— запустить свой API на Python.

Значит наш курс для вас!

🚀 Начните с открытых бесплатных
уроков — переходите в бот курса и жмите «Старт»
👇
@studyit_help_bot

🚀 Скидка на курс
от канала — 1 000₽ на Stepik по промокоду ANALYST до конца апреля.
❤‍🔥4👍21🐳1
🐍 Полюбила функцию .map() — за что и почему?

Ну что, опять рабочий пример. Не сложный - все таки пятница! Недавно нужно было привести разные payment_system к человекочитаемым типам оплаты — карты РФ, карты не РФ, кредиты, оплата частями и т.д. Задача вроде простая — но очень частая: 🧹 "почистить" и структурировать данные.

💡 Решение через .map()
Выглядело это примерно так:

data = {'payment_system': ['sberbank', 'tinkoff', 'stripe', 'tinkoffcredit', 'alpha_bank_podeli'],
'amount': [1000, 2000, 1500, 3000, 2500]}
df = pd.DataFrame(data)

map_dict = {
'sberbank': 'Оплата картами РФ',
'tinkoff': 'Оплата картами РФ',
'stripe': 'Оплата картами не РФ',
'tinkoffcredit': 'Т-Банк кредит',
'alpha_bank_podeli': 'Подели (Альфа-Банк)'
}

df['payment_type'] = df['payment_system'].map(map_dict)


Я сделала категоризацию платежных систем! Круто звучит, правда? А если просто - то, применила словарь к данным в столбце. В вашем случае он заменяет названия платежных систем на их категории. Преобразование занимает одну строку — читаемо, быстро и лаконично.

🔍 Что такое .map() вообще?

.map() — метод в pandas, который применяется к Series (одному столбцу) и возвращает новую Series.
Он может принимать:

словарь — для замены значений (value: new_value) как мы и сделали

функцию — для произвольной логики

⚠️ Нюансы использования:
- Работает только с одной колонкой
- Для нескольких — нужно использовать apply().

Решение через .apply()

def get_payment_type(ps):
if ps in ['sberbank', 'tinkoff']:
return 'Оплата картами РФ'
elif ps == 'stripe':
return 'Оплата картами не РФ'
elif ps == 'tinkoffcredit':
return 'Т-Банк кредит'
elif ps == 'alpha_bank_podeli':
return 'Подели (Альфа-Банк)'
return 'Другое'

df['payment_type'] = df['payment_system'].apply(get_payment_type)

☝️Вывод:
Если нужно быстро заменить или классифицировать значения в одном столбце — .map() 🔥
Особенно удобно с категорией платежей, типов устройств, источников трафика и т.п.

Теперь это один из моих go-to инструментов 💼
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥9❤‍🔥54🐳1
Как не попасть в ловушку собственных выводов? 🧠

Знакомо ли вам чувство, когда кажется, что все факты подтверждают вашу гипотезу — но вдруг оказывается, что вы упустили что-то важное?

В аналитике (да и в жизни) это называется "ошибкой подтверждения" — когда мы подсознательно игнорируем данные, которые противоречат нашим убеждениям. Очень опасная штука! 🔥

Подробнее о ней писал(а) Оля в своем канале — рекомендую к прочтению.

Кстати, Оля — продуктовый аналитик с 3+ годами опыта, и у нее огромный багаж знаний о собеседованиях:
Прошла отбор в 20+ компаний (включая бигтехи)
Провела 50+ технических интервью как интервьюер
Пишет крутые разборы, например, как получить оффер после собеседования

Еще один пост, который меня впечатлил — про парадокс выбора. Это про то, почему больше возможностей — не всегда лучше. Очень близко тем, кто, как и я, долго выбирал между разными карьерными путями.

Её канал — как уютный диванчик в мире аналитики: мало шума, много смысла. Там реально есть, над чем подумать! 💡Диванные Данные 💫"
❤‍🔥8👍521
Умный LIKE: как искать по множеству URL в SQL без боли

Праздники закончились и вот уже третий день суровых будней. Давайте честно признаемся, что после стольких дней отдыха работать ну оочень лень? Я вот честно признаю - мне лениво, но приходится собирать себя по частям и делать дело, много дел, вот еще одно дело, а вот это тоже надо. То запрос на аналитику, то отчёт, то внезапные «срочно-очень-важно» Знакомо? Ну, что ж, у всех примерно такое состояние, так что ничего - выживем.

Расскажу интересный рабочий кейс — как эффективно искать записи по сотням URL в SQL. Покажу на простом примере, как избежать горы OR условий.

Допустим, у нас есть большой список URL-адресов (например, из Excel-файла), и нам нужно найти все посещения этих страниц в нашей базе данных.

Сначала создаем тестовые данные.
import pandas as pd
from pandasql import sqldf

# Мини-датасет для демонстрации
data = {
'page_url': [
'https://site.com/blog/101',
'https://site.com/blog/102',
'https://site.com/blog/103',
'https://site.com/news/101',
'https://site.com/news/102',
'https://site.com/help',
'https://site.com/blog/201',
'https://site.com/blog/202',
'https://site.com/about',
'https://site.com/contact'
],
'visitor_id': [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010],
'visit_date': pd.date_range('2024-01-01', periods=10)
}

df_visits = pd.DataFrame(data)

Список интересующих нас блогов (как будто вы это выгрузили из excel файлика, который вам прислали коллеги, представьте что тут более 100 ссылок)
df_blogs = pd.DataFrame({
'blog_path': ['blog/101', 'blog/102', 'blog/201']
})

🌳Стандартный подход🌳
SELECT * FROM visits
WHERE page_url LIKE '%blog/101%'
OR page_url LIKE '%blog/102%'
OR page_url LIKE '%blog/201%'


🍀Автоматизированное решение 🍀

Динамически генерируем условия LIKE
conditions = " OR ".join([f"page_url LIKE '%{path}%'" for path in df_blogs['blog_path']])

query = f"""
SELECT
page_url,
visitor_id,
visit_date
FROM df_visits
WHERE {conditions}
"""
result = sqldf(query)

Если понравился способ - поставь лайк, а если вам тоже сложно работать после праздников, то добавь там еще каких-нибудь смайликов 🤪😀
Please open Telegram to view this post
VIEW IN TELEGRAM
31🔥9👏3❤‍🔥21🐳1🌚1
🔥 Ах, это чувство «я ничего не успела»

Знакомо чувство, когда вроде бы что-то делаешь, а к обеду/вечеру понимаешь, что «серьезные» задачи так и остались нетронутыми?
Вместо углубления в python — читала статьи, а то и в youtube залипала, вместо разбора сложных кейсов — читала телеграмм каналы других аналитиков , maybe даже мемчики по аналитике (ну а что, тоже развитие? 😅).

Короче, вместо жёсткого фокуса — растекалась по смежным темам, домашним делам... И вот оно — накатывает: «Я опять потратила время зря!»

Но стоп-стоп! Мы же не роботы, чтобы безостановочно генерить код и умные мысли. 🧠 Мозгу нужно «лениться», переваривать инфу, иногда просто смотреть в потолок, и даже — о ужас! — заниматься ерундой.
Это не просто норма — это необходимость!

Нельзя учиться и работать 24/7 без «пустых» промежутков — это путь к выгоранию. Даже «бесполезное» чтение иногда даёт неожиданные инсайты, да хотя бы просто отдых мозгу.
И вообще перфекционизм — главный враг прогресса. Лучше медленно, но без ненависти к себе.

Так что если вы сегодня не выжали из себя все соки и:
не стали гуру SQL
не переписали все свои запросы на оптимизированные
вообще ничего не сделали из «важного» списка

— это не провал!

Завтра будет новый день (и, возможно, опять без подвигов — и это ок 🤫)

Главное — не превращать развитие в бесконечный марафон с чувством вины!

Как вы справляетесь с мыслями что недостаточно продуктивны? 👇 Делитесь в комах — соберём коллекцию лайфхаков!
Я вот - пост написала и мне полегче стало 😂😜🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2210❤‍🔥6👍43
🎁Подарим карьерные консультации от HR-эксперта!

Из разных утюгов много говорят про оптимизации и сокращения (и это факты), стагнацию зарплат и сложности в росте. Особенно в шоке те, кто давно не выходил на рынок или попал в айтишный бум и не успел застать прошлые кризисы.

Обсуждали, что сейчас происходит на рынке с Олей, у нее 9+ лет опыта в it-компаниях, ex. консультант по обучению и развитию в Райффайзенбанке, 4+ года менторит по карьере и помогает разобраться с вопросами профессиональной самореализации. Пишет про адекватную карьеру https://t.iss.one/olga_career

🎯 Чтобы поддержать тех, кому это сейчас нужно, мы решили подарить две консультации. Обращаться можно с любыми карьерными запросами: построить карьерный трек, написать классное резюме, подготовить самопрезентацию к интервью, выбрать новое направление для развития, поработать со страхами/ самозванцем/ выгоранием.

Что еще можно найти в канале?
✔️ Воркбук «Как найти результаты в своей работе и презентовать их», который прошел проверку выступлениями на конференциях
✔️ Икигай в карьере и жизни (узнаете, какие потребности вами движут в данный момент)
✔️ Рекомендации, как составить резюме, чтобы его захотели прочитать.

🗓 Пишите, с чем нужна помощь, в комментариях, 6 июня отпишемся, кому достанутся консультации 🙌
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤‍🔥2🔥1
📍 Я собрала для вас подборку своих постов, которые вы могли пропустить. Даже если некоторые из них вышли давно — они всё ещё огонь! Hard skills — это серьёзно, а не мемы разгонять 🤪 .

🐍 🔤🔤🔤🔤🔤🔤

- Рабочий пример отчета для отдела продаж – формирование группы клиентов по разным условиям
- Особенности pivot_table на питоне
- Примеры сводной таблица pivot_table()
- Создание диапазона дат на питоне
- Рабочий скрипт по отвалу клиентов
- Отвал клиентов с доп.условиями
- Три топ клиента за год в каждой нише
- Кумулятивная функция сumsum()
- Примеры функции transform()
- Вопросы с собеседований по Python и Pandas
- Как определить к какой стране относится номер телефона? библиотека Phonenumbers
- Скрипт по когортному анализу (часть на SQL, часть на пандасе)
- Примеры np.where()
- Регулярные выражения на Питоне. модуль re
- Как ускорить обработку 50 млн строк: переход с Python на Clickhouse. (Регулярки и оптимизация больших данных)
- Исследование среднего ценового сегмента в разрезе определенных категорий. Биннинг с помощью функции cut
- Генерация синтетических данных: разбор тестового от OZON. (Практика с NumPy и Pandas)
- Регулярки в Python: как вытащить нужные данные из текста. (Рабочий пример с re.findall)
- Группировка данных в Pandas: объединяем значения через запятую. (Полезный трюк для отчётов)
- Как правильно выбирать топ-клиентов с прерываемыми индексами? Loc и iloc
- Поиск клиентов с подпиской без перерывов с помощью shift()
- Ищу пользователей, покупающих новый тариф задолго до окончания старого
- Категоризация платежных систем с помощью map

🔤🔤🔤

- Трафик, лиды, конверсия
- SQL Between
- Вопросы с собеседований по SQL
- Тестовое с решением
- Скрипт по когортному анализу (часть на SQL, часть на пандасе)
- Примеры использования CASE
- Group by на примере из курса Карпова и на рабочем примере.
- Регулярка для Clickhouse
- Библиотека Pandasql для написания SQL кода в Jupyter Notebook
- Оконные функции в PostgreSQL: считаем рабочие часы сотрудников. Разбор LAG и FILTER
- Тестовое на SQL: отделы и зарплаты руководителей (JOIN с подзапросами и агрегация)
- Установка PostgreSQL и DBeaver: инструкция для новичков. Как работать с CSV и писать запросы локально)
- LEFT JOIN с условием в ON или WHERE: в чём разница?
- Как извлечь домены почт клиентов: хитрости SUBSTRING_INDEX
- Задача с LeetCode: находим менеджеров с 5+ подчинёнными
- Расчёт коэффициента подтверждения: разбор задачи с LeetCode
- Задача Hard на LeetCode! Department Top Three Salaries
- Задача со stratascratch про перелеты

Ну и просто лёгкое и вдохновляющее:

☹️☹️😙🤑😓😓

- Как я сменила профессию
- Какие бывают аналитики
- Мотивация
- Теория вероятности на минималках
- Как заходить в LinkedIn без VPN
- YandexGPT 2 рассказал почему стоит выбрать карьеру в аналитике данных
- Поддержка в IT: как не сдаться на пути к офферу

- Яндекс.Метрика для чайников: как анализировать трафик в Дзене
- Как войти в IT без опыта
- Прокрастинация и баланс в жизни: как не сгореть в аналитике

p.s. И не забываем про возможность выиграть консультацию, вот пост.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥358😍4
Мир аналитика данных pinned «📍 Я собрала для вас подборку своих постов, которые вы могли пропустить. Даже если некоторые из них вышли давно — они всё ещё огонь! Hard skills — это серьёзно, а не мемы разгонять 🤪 . 🐍 🔤🔤🔤🔤🔤🔤 - Рабочий пример отчета для отдела продаж – формирование…»
🐍 Pandas: Объединяем значения в группах с groupby + join

Сейчас покажу то, что стопудово вы будете часто использовать!
Когда нужно собрать в кучу разрозненные текстовые значения для каждой группы из одной колонки. Например:

☑️Собрать все платформы, на которых работал рекламный аккаунт

☑️Объединить теги товаров из одной категории

☑️Соединить комментарии пользователей

Вот 3 способа как это сделать.
Допустим, у нас есть DataFrame с рекламными расходами:
import pandas as pd
data = { 'account_id': [100, 100, 100, 200, 200, 300, 300, 300, 400, 500],
'platform': ['yandex', 'telegram', 'vk', 'yandex', 'telegram',
'vk', 'yandex', 'telegram', 'yandex', 'vk'],
'amount': [600, 300, 200, 1500, 800, 1200, 600, 400, 900, 750]
}
df = pd.DataFrame(data)


1️⃣groupby + lambda + join 💡
df_grouped = df.groupby('account_id',as_index=False)['platform'].apply(lambda x: ', '.join(x))

lambda x: ... - это анонимная функция. Можно читать как: "Для каждого x (где x — это группа платформ) выполнить join"
Не забываем именно в groupby добавлять as_index=False, а не потом .reset_index(), так как это оптимальнее. Ну и к тому же раз уж в функции groupby есть такой способ, то им надо пользоваться.


2️⃣agg() с join 🔄
df_grouped2 = df.groupby('account_id',as_index=False).agg({'platform': lambda x: ', '.join(x)})


А если обернуть x в set(x), то можно убрать дубликаты если они там есть: df.groupby('account_id',as_index=False).agg({'platform':lambda x:','.join(set(x))})

3️⃣Краткая запись ⚡️
df_grouped3 = df.groupby('account_id',as_index=False)['platform'].apply(', '.join)


Короче, это реально удобно! Вместо нескольких строк с одним account_id получаем одну строку и видим все платформы аккаунта сразу.

А какой способ используете вы? Делитесь ⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥11👍1🌚1
🔥 Аналитики vs нейросети: кто останется на плаву?
Небольшие страшилки вам тут принесла. Пугаться можно, но не сильно. А то потом на психологов тратиться еще придется.
У hh вот такая статистика по количеству вакансий на рынке труда. Почему эта метрика стремительно падает, а не ключевая, блин, ставка?

Короче, в IT количество вакансий сильно сократилось, а вот количество резюме увеличилось. Вот вам и конкуренция!
Да еще и опасение, что скоро нейросети всех заменят! Но заменят ли они нас полностью? Я считаю, что нет. Но сметут тех, кто не готов расти.

GPT сегодня (туда же deepseek и прочие)— как стажер-вундеркинд: то гениальные инсайты выдает, то несет такую дичь, что хоть стой, хоть падай. И вот тут-то пригодятся те, кто умеет его "дрессировать" — проверять, допиливать и направлять. Такие специалисты не пропадут. Остальным стоит задуматься: а что, если завтра вашу работу можно будет автоматизировать за два клика?

Рутину заберут нейросети, а работу получат только те, кто:

➡️ Глубоко разбирается в своей области (хороший жирный плюс),
➡️ Умеет думать, а не просто кликать (хотя и нейронка может думать так-то..),
➡️ Эффективно работает с ИИ и живыми людьми (огромный плюс).

📉 Почему вкатиться стало сложнее?
Раньше хватало 100 откликов на hh, чтобы получить оффер. Сейчас джуны ищут работу полгода и больше, и это если активно прокачивать соцсети и нетворкинг.

Почему так?
🔜 Компании теперь хотят мидлов или джунов с опытом (где бы им его взять, да?).
🔜Экономика тормозит — бюджеты режут.
🔜 Конкуренция выросла: вузы и курсы за компанию штампуют конкурентов.
🔜 ИИ пока не забирает вакансии, но скоро начнет. По ощущениям в ближайшую пятилетку. В магазинах уже кассиров почти нет, одни автоматы стоят.
🔜 На рынок выходит поколение мат.капитала — будет еще жестче. Те, прям со школы уже и питон и статистику изучают.

🛡 Вывод: не жди, действуй.
ИИ не остановить, но можно стать тем, кого не заменят. Учись, адаптируйся, ищи сильные стороны.
Думаете, будет еще какой-то вывод? Нет, финал открыт, как говорится.

Но есть и радостная новость - впереди 4 выходных дня и это ВАУ! 😀😀😀 Да, мы не нейронки и нам хочется отдыхать!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤‍🔥4🔥3🤬31
Можно немного личного? 🌧

Сегодня пятница, а за окном — мокро, серо и… совсем не летнее настроение. Казалось бы, мелочь: ну подумаешь, дождь! Но как же сложно иногда управлять своими эмоциями, когда реальность не совпадает с ожиданиями.

Лето мечты? Пока что «лето в режиме акварели» — размытое и невнятное. 😄 Но ведь так не только с погодой: бывает и в работе, и в отношениях, и даже в хобби. Жизнь любит сюрпризы!

Кстати, о хобби. Кто бы мог подумать, что меня затянет в аквариумистику? Но так зацепило! Рыбки стали неожиданными антистресс-терапевтами. 🐠💙

Давайте делиться настроением!
Как спасаетесь от хандры? Кидайте фото питомцев или ваших «залипательных» хобби — согреем ленту теплом!

И да, аналитика данных никуда не делась - будет настроение и появится новый разбор. А пока посмотрите на моих тернеций 😜
❤‍🔥136🔥4🤯1
📌 Разбор реальной задачи с собеседования

Недавно мне прислали одну из задач, которую дают на собеседованиях. Делитесь в комментариях, сталкивались ли с подобным - а если у вас есть другие тестовые задания (или интересные кейсы из практики), кидайте в личку! Разберём вместе. 👍

Есть таблица просмотров видео с полями:
user_id - идентификатор пользователя,
video_id - идентификатор видео,
date - дата просмотра.
1 строка - это 1 просмотр видео

Задача:
Вывести список пользователей, которые:
Смотрели видео 1 и 3,
Но не смотрели видео 2.

Создадим датафреймчик
data = {
'user_id': [1, 1, 1, 2, 2, 3, 4, 5, 5],
'video_id': [1, 2, 3, 1, 2, 4, 1, 1, 3]
}
df = pd.DataFrame(data)

Есть разные способы решения:

Способ 1: Подзапрос с исключением
query = f"""
SELECT user_id
FROM df
WHERE user_id NOT IN (SELECT user_id FROM df WHERE video_id = 2)
GROUP BY user_id
HAVING COUNT(DISTINCT video_id) = 2
result = sqldf(query)

Исключаем пользователей, которые смотрели видео 2.
Оставляем только тех, у кого ровно 2 уникальных просмотра (то есть 1 и 3). Это будет user_id=5

Способ 2: Фильтрация в HAVING
query = f"""
SELECT user_id
FROM df
GROUP BY user_id
HAVING COUNT(*) FILTER (WHERE video_id = 1) > 0
AND COUNT(*) FILTER (WHERE video_id = 3) > 0
AND COUNT(*) FILTER (WHERE video_id = 2) = 0
result = sqldf(query)

Конструкция FILTER (WHERE ...) очень удобна в задачах, где нужно проверить несколько условий одновременно. Просто шик, блеск, красота!

Способ 3 : CASE в HAVING (по сути замена Filter, в MySQL например)
query = f"""
SELECT user_id
FROM df
GROUP BY user_id
HAVING COUNT(CASE WHEN video_id = 1 THEN 1 END) > 0
AND COUNT(CASE WHEN video_id = 3 THEN 1 END) > 0
AND COUNT(CASE WHEN video_id = 2 THEN 1 END) = 0
"""
result = sqldf(query)


Какой способ лучше?
Первый — лаконичный, но это если нет других вариантов video_id.
Второй и третий — более читаемые и гибкие, особенно если нужно добавить дополнительные условия.

P.S. Если хотите добавить что-то своё или знаете альтернативные способы решения — пишите! А если у вас есть похожие задачи — присылайте, сделаем разбор. 💪🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥195❤‍🔥1
📊 Задачка с собеседования: Самый дорогой товар в первой покупке
Всем привет! Сегодня разберём еще одну интересную задачку, которую часто дают на собеседованиях.

🎯 Условие задачи:
Для каждого пользователя нужно найти наименование и цену самого дорогого товара в его первой транзакции.

🔍 Исходные данные:
У нас есть:
Таблица с покупками (df_orders) - кто, когда и что покупал (user_id, transaction_datetime, item_id, order_id)
Табличка товаров (df_items) - информация о товарах и их ценах (item_id, brand, name, price)

💡 Решение с подзапросами:
select user_id,name,price
from
(
select user_id,order_id,transaction_datetime,price,name,item_id,number_bought,
row_number() OVER (partition by user_id order by price desc) as most_expensive
from(
select user_id,order_id,transaction_datetime, price,name, di.item_id,
dense_rank() OVER (PARTITION BY user_id order by transaction_datetime ) as number_bought
from df_orders do
left join df_items di on di.item_id = do.item_id
) tt
where number_bought=1
)
where most_expensive=1


🎯 Как это работает?
1️⃣ Внутренний подзапрос:

- DENSE_RANK() нумерует все покупки пользователя по времени.
- Если в одной транзакции куплено несколько товаров, у них будет одинаковый number_bought (например, все =1 для первой покупки).
dense_rank() OVER (PARTITION BY user_id order by transaction_datetime ) as number_bought


2️⃣ Средний подзапрос
- Оставляет только товары из первых покупок (WHERE number_bought = 1).
- ROW_NUMBER() сортирует эти товары по цене (дорогие — выше).
row_number() OVER (partition by user_id order by price desc) as most_expensive 


3️⃣Внешний подзапрос выбирает самый дорогой товар из первой покупки (most_expensive=1)


Альтернатива с CTE:
WITH first_purchases AS (
SELECT
user_id, price, name,
DENSE_RANK() OVER (PARTITION BY user_id ORDER BY transaction_datetime) AS number_bought
FROM df_orders
LEFT JOIN df_items USING (item_id)
),
most_expensive_items AS (
SELECT
user_id, name, price,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY price DESC) AS price_rank
FROM first_purchases
WHERE number_bought = 1
)
SELECT user_id, name, price
FROM most_expensive_items
WHERE price_rank = 1

Какой вариант вам ближе — подзапросы или CTE?

P.S. Я сейчас в отпуске 🌴☀️ и принципиально не думаю о SQL. Просто лень не только думать, но и писать. 🤪
(Но код всё равно проверила и протестила)
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5❤‍🔥1🔥1
🔥 Вернулась из отпуска, хватит отдыхать!

Ну что, отпуск пролетел быстро, как и положено отпуску. Немного грустно...
Но зато вчера я узнала про бесплатный интенсив по А/B-тестам от ШАД! И это не реклама. Я сама записалась и уже посмотрела первую лекцию.

📌 Что крутого?
Программа – огонь: бутстрап, линеаризация, CUPED и другие важные темы.
Можно подключиться по записи (первая лекция уже есть, но всё ещё успеваешь!).
Есть ноутбуки с кодом - поковыряться, потестить циферки для практики, а это я уважаю. 💪

📅 Регистрация открыта до 25 июля. Ну грех не поделиться ХАЛЯВОЙ!

Сертификат дают только после отбора, но, честно, главное – знания, а не бумажка. 🚀
Кому совсем лень, гляньте первый ноутбук - там же красотища вообще 🎁

p.s. Если после строчки import scipy.stats у вас чешутся руки запустить симуляции — вы тот ещё симулянт! 🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥133❤‍🔥1