Mysql - сгруппировать и выбрать максимальное значение - PullRequest
0 голосов
/ 16 марта 2019

У меня есть следующие таблицы:

reservas_tanatosalas enter image description here

У меня следующий запрос:

SELECT r.cod_reserva, MAX(r.hora_fin_utc) FROM reservas_tanatosalas r GROUP BY r.cod_tanatosala

Результаты: Показывает правильное максимальное значение, но неверное cod_reserva. Почему?

cod_reserva  MAX(r.hora_fin_utc)
7           9999999999
6           9999999999

Что я хочу получить?:

cod_reserva  MAX(r.hora_fin_utc)
7           9999999999
8           9999999999

UPDATE

cod_reserva может измениться на varchar в будущем, поэтому я не могу использовать max для него.

Ответы [ 4 ]

1 голос
/ 16 марта 2019

Не используйте GROUP BY для этого.Ваш запрос искажен и не будет работать в самых последних версиях MySQL (с настройками по умолчанию) или почти в любой базе данных.

select r.*
from r
where r.hora_fin_utc = (select max(r2.hora_fin_utc)
                        from reservas_tanatosalas r2
                        where r2.cod_tanatosala = r.cod_tanatosala
                       );

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

Если производительность является проблемой, то вам нужен индекс для (cod_tanatosala, hora_fin_utc).

ЭтоВаш запрос:

Это запрос:

SELECT r.cod_reserva, MAX(r.cod_tanatosala) FROM reservas_tanatosalas r
GROUP BY r.cod_tanatosala
HAVING MAX(r.hora_fin_utc)

Это говорит:

  • создать одну строку для каждого значения cod_tanatosala
  • возвращает максимальное значение cod_tanatosala
  • ОШИБКА ЗДЕСЬ: Не знаю, что делать с cod_reserva.Это не аргумент функции агрегирования или GROUP BY.

. HAVING просто утверждает, что MAX(r.hora_fin_utc) не является ни 0, ни NULL.Не очень полезно.

0 голосов
/ 16 марта 2019

Во-первых, в большинстве баз данных, включая новую версию Mysql, этот код выдаст ошибку, поскольку вы группируете по столбцу, который не является частью select.Следующий запрос даст вам то, что вы ищете для набора данных, который вы показали

select (select t.cod_reserva from reservas_tanatosalas t 
        where t.hora_fin_utc = a.max_hora_fin_utc 
        and a.cod_tanatosala = t.cod_tanatosala) cod_reserva, 
        a.max_hora_fin_utc
from (
    SELECT x.cod_tanatosala, MAX(x.hora_fin_utc)max_hora_fin_utc
    FROM reservas_tanatosalas x group by x.cod_tanatosala
)a;
0 голосов
/ 16 марта 2019

Я выполнил тот же запрос, что и ваш,

SELECT MAX(r.cod_reserva), MAX(r.hora_fin_utc) FROM reservas_tanatosalas r GROUP BY r.cod_tanatosala

Но я также использовал агрегатную функцию MAX () в r.cod_reserva, потому что без него выдает ошибку "это несовместимо с sql_mode = only_full_group_by"и у меня это работает, вы можете проверить это с помощью MAX (r.cod_reserva).

0 голосов
/ 16 марта 2019

Вы группируете набор результатов, используя другой столбец, в то время как ваш оператор выбора ссылается на другой. Следующее должно определенно работать, пожалуйста, дайте мне знать, если это не так:

SELECT 
    r.cod_reserva, MAX(r.hora_fin_utc) 
FROM 
    reservas_tanatosalas r 
GROUP BY 
    r.cod_reserva
HAVING 
    MAX(r.hora_fin_utc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...