У меня есть производная таблица, которая выглядит так
Я хотел бы получить лучшего продавца в каждом квартале, поэтому результат должен выглядеть так
Таблица получена из более крупной таблицы, в которой есть много других полей, а столбец «Продажи» представляет собой сумму индивидуальных продаж для этого продавца в исходной таблице, поэтому я фактически использую это в предложении With (например, With t1 as (еще один сложный SQL) ВЫБРАТЬ... Но если я попытаюсь использовать
SELECT Quarter, Max(Sales), Salesperson from t1 group by Quarter
Запрос завершается с ошибкой, поскольку продавец не указан в предложении GROUP BY.
Хорошо, попробую переформатировать таблицу. Я использую MySql 8.3
Яркий прозрачный фоновый цвет для изображений на столе. В темном режиме ваши таблицы практически нечитабельны.
@BartMcEndree Почти? Я ничего не вижу, пока не нажму на изображения :P
Таблицы исправил, спасибо за советы по форматированию
На самом деле для этого есть лучший «дубликат», чем тот, который указан в заключительной заметке — stackoverflow.com/questions/12102200/…


В MySQL 8.3 вы можете использовать оконные функции для выполнения этой логики:
SELECT Quarter, Sales, SalesPerson
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY QUARTER ORDER BY SALES DESC) as rn
FROM your_table_here
) dt
WHERE rn = 1;
Этот бит ROW_NUMBER() разделит записи на фрагменты/разделы для каждого отдельного квартала. Затем он упорядочит их по продажам и добавит номер строки, начиная с 1. Тогда предложение WHERE выбирает только записи с rn из 1.
Спасибо, у меня это заработало с небольшой поправкой: присвоение псевдонима производной таблице.
Ой! Я всегда забываю псевдоним. Я добавил это в ответ.
Альтернативный подход: (с использованием старого шаблона проектирования)
WITH t1 as (another complicated SQL)
SELECT a.Quarter, Sales, a.Salesperson
FROM t1 a
INNER JOIN (SELECT max(sales) Isales, Quarter
FROM T1
GROUP BY Quarter ) b
on A.quarter = b.quarter
and a.sales = B.Isales
Новейший шаблон дизайна:
.
WITH t1 as (another complicated SQL)
SELECT a.Quarter, Sales, a.Salesperson
FROM t1 a
INNER JOIN LATERAL (SELECT sales, Quarter
FROM T1
ORDER BY Sales Desc
LIMIT 1) b
on A.quarter = b.quarter
Пожалуйста, не добавляйте данные в виде снимка экрана, так как нам придется расшифровать их, чтобы реплицировать локально для решения. Вместо этого используйте уценку таблицы stackoverflow или таблицу ascii внутри блока кода. И еще, какая у вас версия MySQL? Это похоже на работу для ситуации
ROW_NUMBER() OVER (PARTITION BY QUARTER ORDER BY SALES DESC) as rnтипа, но она доступна только в версиях MySQL 8+.