SQL-запрос, чтобы получить максимум внутри группы, а затем присоединить к нему еще одно поле

У меня есть производная таблица, которая выглядит так

Продавец Четверть Продажи Джек 1 квартал 100 Джек 2 квартал 10 Джек 3 квартал 110 Джек 4 квартал 100 Мэри 1 квартал 80 Мэри 2 квартал 200 Мэри 3 квартал 25 Мэри 4 квартал 30

Я хотел бы получить лучшего продавца в каждом квартале, поэтому результат должен выглядеть так

Четверть Лучший продавец Продажи 1 квартал Джек 100 2 квартал Мэри 200 3 квартал Джек 110 4 квартал Джек 200

Таблица получена из более крупной таблицы, в которой есть много других полей, а столбец «Продажи» представляет собой сумму индивидуальных продаж для этого продавца в исходной таблице, поэтому я фактически использую это в предложении With (например, With t1 as (еще один сложный SQL) ВЫБРАТЬ... Но если я попытаюсь использовать

 SELECT Quarter, Max(Sales), Salesperson from t1 group by Quarter 

Запрос завершается с ошибкой, поскольку продавец не указан в предложении GROUP BY.

Пожалуйста, не добавляйте данные в виде снимка экрана, так как нам придется расшифровать их, чтобы реплицировать локально для решения. Вместо этого используйте уценку таблицы stackoverflow или таблицу ascii внутри блока кода. И еще, какая у вас версия MySQL? Это похоже на работу для ситуации ROW_NUMBER() OVER (PARTITION BY QUARTER ORDER BY SALES DESC) as rn типа, но она доступна только в версиях MySQL 8+.

JNevill 30.05.2024 15:45

Хорошо, попробую переформатировать таблицу. Я использую MySql 8.3

Cyclotron 30.05.2024 15:53

Яркий прозрачный фоновый цвет для изображений на столе. В темном режиме ваши таблицы практически нечитабельны.

Bart McEndree 30.05.2024 16:10

@BartMcEndree Почти? Я ничего не вижу, пока не нажму на изображения :P

xQbert 30.05.2024 18:10

Таблицы исправил, спасибо за советы по форматированию

Cyclotron 30.05.2024 18:45

На самом деле для этого есть лучший «дубликат», чем тот, который указан в заключительной заметке — stackoverflow.com/questions/12102200/…

Cyclotron 02.06.2024 01:56
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
6
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В 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.

Спасибо, у меня это заработало с небольшой поправкой: присвоение псевдонима производной таблице.

Cyclotron 30.05.2024 16:10

Ой! Я всегда забываю псевдоним. Я добавил это в ответ.

JNevill 30.05.2024 16:16

Альтернативный подход: (с использованием старого шаблона проектирования)

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

Другие вопросы по теме