tgoop.com/sqlhub/1896
Create:
Last Update:
Last Update:
🎯 SQL-задача с подвохом для аналитиков
Таблица sales:
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
seller_name VARCHAR,
sale_amount NUMERIC,
sale_date DATE
);
📌 Задача:
Найди имя продавца, который заработал максимальную сумму за каждый месяц.
🧠 Подвох:
Многие пытаются использовать
GROUP BY month, seller_name и MAX(), но это не даст имя продавца — только сумму. Нужно вернуть имя лучшего продавца за месяц. А если таких несколько? Тоже учти.💡 Подсказки:
• Сначала сгруппируй продажи по
month и seller_name • Посчитай
SUM(sale_amount) • Используй оконную функцию
RANK() или ROW_NUMBER() • Отфильтруй только те строки, где
rank = 1🧩 Решение:
WITH monthly_totals AS (
SELECT
DATE_TRUNC('month', sale_date) AS month,
seller_name,
SUM(sale_amount) AS total
FROM sales
GROUP BY 1, 2
),
ranked AS (
SELECT *,
RANK() OVER (PARTITION BY month ORDER BY total DESC) AS rnk
FROM monthly_totals
)
SELECT month, seller_name, total
FROM ranked
WHERE rnk = 1
ORDER BY month;
👀 Бонус-вопрос:
Что будет, если у двух продавцов одинаковая сумма за месяц?
Какой оконной функцией это корректно учесть?
👉
RANK() вернёт обоих, ROW_NUMBER() — только одного.📌 Отличная задача, чтобы проверить знание оконных функций и работы с агрегацией в SQL.
@sqlhub
BY Data Science. SQL hub
Share with your friend now:
tgoop.com/sqlhub/1896
