выберите различное col1 с min (col2) и max (col3) из таблицы - PullRequest
1 голос
/ 12 мая 2010

Моя таблица выглядит так с дубликатами в col1

col1,      col2,      col3,      col4
1,            1,            0,            a
1,            2,            1,            a
1,            3,            1,            a
2,            4,            1,            b
3,            5,            0,            c  

Я хочу выбрать разные col1 с max (col3) и min (col2); поэтому набор результатов будет:

col1,      col2,      col3,      col4
1,            2,            1,            a
2,            4,            1,            b
3,            5,            0,            c

У меня есть решение, но я ищу лучшие идеи?

1 Ответ

4 голосов
/ 12 мая 2010
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 очка репутации.

...