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