Как получить значение столбца с соответствующим максимальным значением другого столбца

У меня есть таблица со столбцами A,B,C. Для каждого значения colC я хочу выбрать значение colB с максимальным значением colA.

Я не могу использовать Group By, поскольку она ведет к столбцу b.

У меня есть:

Я хочу:

Вероятно, об этом спрашивали раньше, но я не могу ответить на этот вопрос здесь.

Я не следую логике, можете уточнить, что вы имеете в виду под for each value of ColC, choose value in ColB with the max value of ColC ? почему ColC val = 1 будет максимальным значением?

iBeMeltin 21.08.2024 15:10

Полагаю, вы испортили свое объяснение. Вы ищете строки с максимальным значением ColA для каждого ColC? Если да, то может ли случиться так, что найдутся две строки с одинаковыми ColC и ColA? Если да, то какие строки показывать?

Thorsten Kettner 21.08.2024 15:12

И пожалуйста, не загружайте изображения кода/данных/ошибок. Вместо этого скопируйте и вставьте данные в виде форматированного текста в запрос.

Thorsten Kettner 21.08.2024 15:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как насчет этого? (как в таблице, которую вы показали).

SELECT colA,
    colB,
    colC
FROM My_Table
GROUP BY colC
HAVING colA = MAX(colA);

Это неверный SQL. Вы GROUP BY colC, поэтому вы получаете одну строку результата на каждое значение colC. В предложении HAVING вам нужен colA = MAX(colA), но какой colA? В одном значении colC может быть много значений colA, и в предложении HAVING вы больше не смотрите на отдельные строки, а на результаты агрегирования. colA не является результатом агрегирования и, следовательно, не может использоваться там. То же самое касается colA и colB в вашем предложении SELECT. Как вы GROUP BY colC, вы должны указать СУБД, какое значение colA и какое значение colB отображать; не существует только одного colA и одного colB на colC.

Thorsten Kettner 21.08.2024 16:58

Хорошо, спасибо за эти объяснения! Но с другой стороны, потерять очки репутации довольно сложно. Я имею в виду, это ошибка, но идея все же заключалась в том, чтобы попытаться помочь. В любом случае, в следующий раз я буду осторожнее

R_User_001 21.08.2024 19:13

Да, извините, я никогда не собираюсь минусовать людей; Я голосую за и против ответов, чтобы показать, какие ответы следует учитывать. Именно так работает stackoverflow, и именно поэтому лучшие ответы обычно появляются первыми, когда кто-то ищет ответ на свою проблему.

Thorsten Kettner 21.08.2024 19:43

@R_User_001 Если вас волнует репутация, вы ошибаетесь. Цель этого сайта — помогать людям решать проблемы, а не выигрывать репутационную гонку. В любом случае вы можете использовать сайт скрипки, чтобы опробовать свой код, прежде чем писать ответ. Это не только увеличит ваши шансы получить голоса «за», но и повысит вероятность того, что ваш ответ решит проблему.

Jonas Metzler 21.08.2024 21:36

@Йонас Мецлер, возможно, я не совсем ясно выразился. Как я сказал в своем комментарии, «идея все еще заключалась в том, чтобы попытаться помочь». Я имел в виду, что если вы публикуете ответ, по сути, вы делаете это, чтобы помочь людям решить проблему; и поэтому, даже если вы ее не решите, никакого отрицательного результата быть не должно (будь то потеря репутации или что-то еще). Я не знаю, имеет ли это больше смысла сейчас? P.S: спасибо за совет по сайту скрипок; на самом деле я пробовал использовать некоторые из своих обучающих данных в MySQL Workbench, но поскольку данные не совпадают, трудно быть уверенным, что это сработает.

R_User_001 21.08.2024 22:54
Ответ принят как подходящий

Вы можете использовать windows function. Ваше описание того, что вы хотите, сбивает с толку, но похоже, что вам нужна строка с максимальным значением colA, сгруппированная по colC. Предполагается, что ваша СУБД (которую вы не отметили) поддерживает функцию row_number() windows.

select colA, colB, colC
from (
  select colA, colB, colC, 
   row_number() over (partition by colC order by colA desc) as rn
  from table1
)z
where rn = 1
order by colC;

Посмотрите эту скрипку

Очень хорошее решение! Я не знал метода разделения, и я вижу, насколько он мощный. Большое спасибо. Ответ принят!

k.dkhk 22.08.2024 14:26

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