TGViewer
Мир аналитика данных Мир аналитика данных @analysts_world · 4.56K subscribers
Post #267 3.44K
📊 Задачка с собеседования: Самый дорогой товар в первой покупке
Всем привет! Сегодня разберём еще одну интересную задачку, которую часто дают на собеседованиях.

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

🔍 Исходные данные:
У нас есть:
Таблица с покупками (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. Просто лень не только думать, но и писать. 🤪
(Но код всё равно проверила и протестила)
  • ❤ 8
  • 👍 5
  • ❤‍🔥 1
  • 🔥 1
More from @analysts_world
  1. Sep 21, 2026📊 Задачка с собеседования Ну что, по итогам голосования большинство хотят задачки и sql.…
  2. Sep 14, 2026Post #345
  3. Sep 14, 2026Что-то я тут прям зачастила с A/B тестами 😅 Смотрю на последние посты и такое чувство, чт…
  4. Sep 1, 2026🎒 С 1 сентября, друзья! Сегодня как раз отправила своих детей в школу – и вот это чувство…
  5. Aug 24, 2026Вне выборки Обычно здесь про SQL, Python и AB-тесты. Но не всё, что важно, попадает в выбо…
  6. Aug 20, 2026Fuckup Night от создателей Trisigma, Ares и karpov.courses Согласитесь, ивенты, где все де…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →