SELECT col1, MAX(col3) AS col3, MIN(col2) AS col2, MAX(col4) AS col4
FROM MyTable
GROUP BY col1;
Вы показали в своем примере, что хотите включить col4
, но не сказали, какое значение вы хотите. Вы должны поместить этот столбец в статистическую функцию или в предложение GROUP BY
. Я предположил, что принятие максимума для группы будет приемлемым.
обновление: Спасибо за разъяснения. Вы спрашиваете об одной из самых больших проблем в группе, которая часто возникает при переполнении стека. Вот мое обычное решение:
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t3
ON t1.col1 = t3.col1 AND t1.col3 < t3.col3
WHERE t3.col1 IS NULL;
На английском языке: показать мне строку (t1
), для которой не существует ни одной строки с таким же col1
и большим значением в col3
. Некоторые люди пишут это, используя предикат подзапроса NOT EXISTS
, но я предпочитаю синтаксис JOIN
.
Вот результат моего теста с данными вашего примера:
+------+------+------+------+
| col1 | col2 | col3 | col4 |
+------+------+------+------+
| 1 | 2 | 1 | a |
| 1 | 3 | 1 | a |
| 2 | 4 | 1 | b |
| 3 | 5 | 0 | c |
+------+------+------+------+
Обратите внимание, что есть две строки для col1
значения 1, поскольку обе строки удовлетворяют условию соединения; нет другой строки с большим значением в col3
.
Так что нам нужно добавить еще одно условие для устранения связи. Вы хотите сравнить строки с меньшим значением в col2
, и если таких строк не существует, мы нашли строку с наименьшим значением в col2
.
SELECT t1.*
FROM MyTable t1
LEFT OUTER JOIN MyTable t3
ON t1.col1 = t3.col1 AND t1.col3 < t3.col3
LEFT OUTER JOIN MyTable t2
ON t1.col1 = t2.col1 AND t1.col3 = t2.col3 AND t1.col2 > t2.col2
WHERE t2.col1 IS NULL AND t3.col1 IS NULL;
Вот результат моего теста с данными вашего примера:
+------+------+------+------+
| col1 | col2 | col3 | col4 |
+------+------+------+------+
| 1 | 2 | 1 | a |
| 2 | 4 | 1 | b |
| 3 | 5 | 0 | c |
+------+------+------+------+
PS: Кстати, в Stack Overflow принято редактировать исходный вопрос и добавлять детали, а не добавлять ответы на свой вопрос, которые только проясняют вопрос. Но я знаю, что некоторые действия вам недоступны, пока вы не наберете более 1 очка репутации.