У меня есть таблица со столбцами A,B,C. Для каждого значения colC я хочу выбрать значение colB с максимальным значением colA.
Я не могу использовать Group By, поскольку она ведет к столбцу b.
У меня есть:
Я хочу:
Вероятно, об этом спрашивали раньше, но я не могу ответить на этот вопрос здесь.
Полагаю, вы испортили свое объяснение. Вы ищете строки с максимальным значением ColA для каждого ColC? Если да, то может ли случиться так, что найдутся две строки с одинаковыми ColC и ColA? Если да, то какие строки показывать?
И пожалуйста, не загружайте изображения кода/данных/ошибок. Вместо этого скопируйте и вставьте данные в виде форматированного текста в запрос.


Как насчет этого? (как в таблице, которую вы показали).
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.
Хорошо, спасибо за эти объяснения! Но с другой стороны, потерять очки репутации довольно сложно. Я имею в виду, это ошибка, но идея все же заключалась в том, чтобы попытаться помочь. В любом случае, в следующий раз я буду осторожнее
Да, извините, я никогда не собираюсь минусовать людей; Я голосую за и против ответов, чтобы показать, какие ответы следует учитывать. Именно так работает stackoverflow, и именно поэтому лучшие ответы обычно появляются первыми, когда кто-то ищет ответ на свою проблему.
@R_User_001 Если вас волнует репутация, вы ошибаетесь. Цель этого сайта — помогать людям решать проблемы, а не выигрывать репутационную гонку. В любом случае вы можете использовать сайт скрипки, чтобы опробовать свой код, прежде чем писать ответ. Это не только увеличит ваши шансы получить голоса «за», но и повысит вероятность того, что ваш ответ решит проблему.
@Йонас Мецлер, возможно, я не совсем ясно выразился. Как я сказал в своем комментарии, «идея все еще заключалась в том, чтобы попытаться помочь». Я имел в виду, что если вы публикуете ответ, по сути, вы делаете это, чтобы помочь людям решить проблему; и поэтому, даже если вы ее не решите, никакого отрицательного результата быть не должно (будь то потеря репутации или что-то еще). Я не знаю, имеет ли это больше смысла сейчас? P.S: спасибо за совет по сайту скрипок; на самом деле я пробовал использовать некоторые из своих обучающих данных в MySQL Workbench, но поскольку данные не совпадают, трудно быть уверенным, что это сработает.
Вы можете использовать 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;
Посмотрите эту скрипку
Очень хорошее решение! Я не знал метода разделения, и я вижу, насколько он мощный. Большое спасибо. Ответ принят!
Я не следую логике, можете уточнить, что вы имеете в виду под
for each value of ColC, choose value in ColB with the max value of ColC? почемуColC val = 1будет максимальным значением?