Строки с максимальными значениями в группе

Shooreek

Здравствуйте, уважаемые.Возможно, этот вопрос задается не в первый раз, но на формуме я его не нашел (может плохо искал? Буду рад полезной ссылке).Вопрос. Есть таблица со столбцами column1, column2 и column3. Нужно вернуть строки, которые содержат максимальное значение column1 при группировке по column2. Обращаю внимание, что в результате может быть не только одна строка.Само максимально значение возвращается таким образом (насколько я знаю):
SELECT MAX(column1) FROM table1 group by column2
А вот как вернуть всю строку, содержащую это значение ( MAX(column1) )?Заранее спасибо за совет.П.С. Что-то вроде этого, только с возвратом все строки, а не только максимального значения.
14 ответов

Shooreek

Не совсем понятен вопрос... max и возвращает максимальное значение.


Shooreek

group_concat()?


Shooreek

SELECT * FROM table1 WHERE column1 IN (
 SELECT MAX(column1) FROM table1 GROUP BY column2
)


Shooreek

SELECT * FROM table1 WHERE column1 IN (
 SELECT MAX(column1) FROM table1 GROUP BY column2
)
Может дать неверный результат.Имхо, правильнее так:
SELECT t1.* FROM table1 t1, (SELECT column2, MAX(column1) column1 FROM table1 GROUP BY column2) t2
WHERE t1.column2=t2.column2 AND t1.column1=t2.column1


Shooreek

Может дать неверный результат.
почему?


Shooreek

SELECT t1.* 
FROM table1 t1 LEFT JOIN table1 t2 ON t1.column2=t2.column2 AND t1.column1<t2.column1 
WHERE t2.column1 IS NULL


Shooreek

почему?
из-за отсутсвия склейки по column2


Shooreek

из-за отсутсвия склейки по column2
а кто сказал, что нужно склеивать? я так понял, что как раз наоборот - НЕ нужно:
Нужно вернуть строки, которые содержат максимальное значение column1 при группировке по column2.


Shooreek

а кто сказал, что нужно склеивать? я так понял, что как раз наоборот - НЕ нужно:
Пример:
column1
Правильным результатом будет
column1
А ваш запрос даст
column1


Shooreek

это я понимаюпросто я интерпретировал задачу:
Нужно вернуть строки, которые содержат максимальное значение column1 при группировке по column2.
как:берем все максимальные значения column1 при группировке по column2 и возвращаем все строки, которые содержат эти значения в column1 (про "склейку" ничего не сказано)в такой интерпретации мой запрос работает правильно, а что именно имел ввиду автор - пусть выбирает из предложенных ему вариантов :)


Shooreek

это я понимаюпросто я интерпретировал задачу:как:берем все максимальные значения column1 при группировке по column2 и возвращаем все строки, которые содержат эти значения в column1 (про "склейку" ничего не сказано)в такой интерпретации мой запрос работает правильно, а что именно имел ввиду автор - пусть выбирает из предложенных ему вариантов :)
В моей интерпретации для каждой группы по column2 свое максимальное значение column1, т.к., имхо, смешивать их в кучу смысла мало.


Shooreek

Следующий запрос надолго подвешивает сервер (недождался ответа, хотя сервер считал 1.5Гб, что в сотню раз болше размера таблицы ):
SELECT * FROM table1 WHERE column1 IN (
 SELECT MAX(column1) FROM table1 GROUP BY column2
)
Следующий запрос не возвращает никаких результатов (хотя должен):
SELECT t1.* 
FROM table1 t1 LEFT JOIN table1 t2 ON t1.column2=t2.column2 AND t1.column1<t2.column1 
WHERE t2.column1 IS NULL
Слудующий запрос возвращает то, что надо (miksoft, спасибо за совет!):
SELECT t1.* FROM table1 t1, (SELECT column2, MAX(column1) column1 FROM table1 GROUP BY column2) t2
WHERE t1.column2=t2.column2 AND t1.column1=t2.column1
Спасибо всем, кто принимал участие в дискуссии.


Shooreek

Следующий запрос надолго подвешивает сервер (недождался ответа, хотя сервер считал 1.5Гб, что в сотню раз болше размера таблицы ):
лишний раз подтвердилась кривизна работы MySQL с "IN (подзапрос, возвращающий больше одного результата)" :(проверил варианты с IN и JOIN на MySQL и MS SQL, тормозит только вариант IN+MySQL


Shooreek

лишний раз подтвердилась кривизна работы MySQL с "IN (подзапрос, возвращающий больше одного результата)" :(проверил варианты с IN и JOIN на MySQL и MS SQL, тормозит только вариант IN+MySQL
Просто оптимизатор MS SQL умеет переписывать вариат с IN в вариант с JOIN нотацией. А MySQL пока ещё не умеет такого, оставляя сей труд на совесть программиста, пишущего запрос...