TGViewer
Аналитический джаз Аналитический джаз @jazzlitics · 3.01K subscribers
Post #272 2.2K
Разбор задачек с собеседований vol. 1

Что-то в последнее время мало разбирали задачек 🙃

При этом это формат 1 apple a day keeps the doctor away 🍏 - вроде и не ботаете активно, но держите себя в форме, проверяя, что помните основные концепты. Так что исправляемся 😉

Погнали. Задачка с интервью в Умскул.
Схема БД:
Таблица `orders` (order_id, user_id, program_id, order_date, buy_date, state, order_sum)
Таблица `programs` (id, name, type, direction)


Задача:
Вывести все программы и сумму продаж по ним, отсортировать по убыванию суммы продаж. Нужно учесть только оплаченные заказы (state = 'success').


Прежде чем вывести решение, вдумчиво прочитаем условие и поймем, что это значит.

➡️ Вывести нужно все программы

У вас могут быть программы без заказов, что вас сразу обязывает к LEFT JOIN, а не JOIN.

Читаете условие - сразу думаете, что будет, если у программы нет ордеров. Или если есть ордера без программы. Проще говоря, о null'ах. И как вы это обходите в решении.


➡️ Есть фильтр, влияющий только на одну из таблиц

Вы хотите учитывать только оплаченные заказы, но это фильтрует только (!) orders. programs не фильтруются, а это значит, что нужно или использовать подзапрос / CTE, или фильтровать через join (это сейчас покажу).

Видите фильтр - сразу себе отмечаете, на какие таблицы он реально должен влиять.


❗️ Важно - мы прочитали каждое предложение и поняли, как мы это внедрим в код. На реальном собеседовании вам тоже нужно будет убедиться, что вы используете условие полностью.

Теперь решение:

SELECT
p.id,
p.name,
COALESCE(SUM(o.order_sum), 0) AS total_sales
FROM programs p
LEFT JOIN orders o
ON p.id = o.program_id
AND o.state = 'success'
GROUP BY p.id, p.name
ORDER BY total_sales DESC;


В принципе, у нас тут было два варианта - или сначала фильтрануть orders, или сделать left join на o.state = 'success'. На мой взгляд, решение выше более элегантное. Но так тоже сработает:


SELECT
p.id,
p.name,
COALESCE(SUM(o.order_sum), 0) AS total_sales
FROM programs p
LEFT JOIN
(SELECT *
FROM orders
WHERE state = 'success') o
ON p.id = o.program_id
GROUP BY p.id, p.name
ORDER BY total_sales DESC;


Если хотите что-нибудь конкретное разобрать, накидывайте задачки в комменты 🤑

А так жду ваших 🔥 и готовлюсь к следующим сериям 🥰
  • 🔥 36
  • ❤ 10
  • ❤‍🔥 3
  • 👍 2
More from @jazzlitics
  1. Sep 28, 2026Где смотреть задачки с собеседований в бигтехи? Бывало ли у вас, что собеседование уже зав…
  2. Sep 26, 2026✈️ Почему я решила переезжать? ✈️ Продолжу пока выходные свой рассказ про релокацию, а дал…
  3. Sep 23, 2026🇪🇺 Про поиск работы в Европе 🇪🇺 Мы с МЧ еще в марте стали активно думать о релокации,…
  4. Sep 19, 2026Разбор задачек с собеседований vol. 12 🍏 Сегодня у нас бородатая статистика, но я не я, е…
  5. Sep 16, 2026Правильный ответ, который может стоить вам собеса Сегодня мы поговорим про ситуацию, котор…
  6. Sep 13, 2026Шпаргалка по EXISTS и NOT EXISTS Какое-то время назад разбирала (NOT) EXISTS на лекции по…
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 →