Я могу использовать несовокупные столбцы с группой?

Вы не можете (не должен), помещенный не агрегироваться в SELECT строка a GROUP BY запрос.

Я однако хотел бы доступ тот из неагрегатов, связанных с максимум. На простом английском языке я хочу таблицу с самым старым идентификатором каждого вида.

CREATE TABLE stuff (
   id int,
   kind int,
   age int
);

Этот запрос дает мне информацию, которая я после:

SELECT kind, MAX(age)
FROM stuff
GROUP BY kind;

Но это не находится в самой полезной форме. Я действительно хочу id связанный с каждой строкой, таким образом, я могу использовать его в более поздних запросах.

Я ищу что-то вроде этого:

SELECT id, kind, MAX(age)
FROM stuff
GROUP BY kind;

Это производит это:

SELECT stuff.*
FROM
   stuff,
   ( SELECT kind, MAX(age)
     FROM stuff
     GROUP BY kind) maxes
WHERE
   stuff.kind = maxes.kind AND
   stuff.age = maxes.age

Действительно кажется, что должен быть способ получить эту информацию, не будучи должен присоединиться. Мне просто нужен механизм SQL для запоминания других столбцов, когда он вычисляет максимум.

16
задан urig 23 June 2019 в 19:31
поделиться

4 ответа

Невозможно получить идентификатор строки, найденной MAX, потому что может быть не только один идентификатор с максимальным возрастом.

12
ответ дан 30 November 2019 в 21:53
поделиться

У вас должно быть соединение, потому что агрегатная функция max извлекает много строк и выбирает макс. Итак, вам нужно объединение, чтобы выбрать то, которое было найдено агрегатной функцией.

Другими словами, как вы ожидаете, что запрос будет вести себя, если вы замените max на сумму?

Однако внутреннее соединение может быть более эффективным, чем ваш подзапрос.

1
ответ дан 30 November 2019 в 21:53
поделиться

Вы не можете (не должны) помещать неагрегатные данные в строку SELECT запроса GROUP BY.

Вы можете и должны определить, по чему вы группируете, чтобы агрегатная функция возвращала правильный результат.

MySQL (и SQLite) в своей бесконечной мудрости решили, что они пойдут против спецификации и позволят запросам принимать предложения GROUP BY, в которых отсутствуют столбцы, указанные в SELECT - это фактически делает эти запросы непереносимыми.

Похоже, что должен быть способ получить эту информацию без необходимости присоединяться.

Без доступа к функциям аналитики / ранжирования / управления окнами, которые MySQL не поддерживает, самостоятельное присоединение к производной таблице / встроенному представлению является наиболее переносимым средством получения желаемого результата.

6
ответ дан 30 November 2019 в 21:53
поделиться

Я думаю, что действительно заманчиво попросить систему решить проблему за один проход, вместо того, чтобы делать работу дважды (найти максимум и найти соответствующий идентификатор). Вы можете использовать CONCAT (как предложено в статье, на которую ссылается Naktibalda), но не уверен, что это будет более эффективно

SELECT MAX( CONCAT( LPAD(age, 10, '0'), '-', id)
FROM STUFF1
GROUP BY kind;

Должно сработать, вам придется разделить ответ, чтобы получить возраст и id. (Хотя это очень некрасиво)

2
ответ дан 30 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: