Использование GROUP BY с MAX () / MIN () дает плохие результаты - PullRequest
0 голосов
/ 31 января 2020

Таблица

Запрос

SELECT
    id, MAX(fecha_hora_carga) AS fecha_hora_carga
FROM
    calibraciones_instrumentos
GROUP BY
    instrumento_id

Результат

enter image description here

Возвращает самые последние fecha_hora_carga даты, но ids - это 24 и 28 ... я думаю, что они должны быть 27 и 29!

Почему идентификаторы не соответствуют дате?

Ответы [ 3 ]

3 голосов
/ 31 января 2020

Проблема в MySQL не имеет большого смысла при группировании по максимальному значению. Он захватывает столбец max, а затем остальные столбцы в той таблице, которую вы выбрали, в любом порядке сортировки.

Чтобы получить то, что вы хотите, вы должны использовать подзапросы, чтобы получить нужные данные. Вот пример:

SELECT
    t1.id,
    t1.fecha_hora_carga
FROM
    calibraciones_instrumentos AS t1
JOIN(
    SELECT MAX(fecha_hora_carga) AS fecha_hora_carga,
        instrument_id
    FROM
        calibraciones_instrumentos
    GROUP BY
        instrument_id
) AS t2
ON  (t1.fecha_hora_carga = t2.fecha_hora_carga AND
     t1.instrument_id = t2.instrument_id
    );
2 голосов
/ 31 января 2020

Потому что вы злоупотребляете SQL. У вас есть один столбец в предложении GROUP BY, и этот столбец даже не выбран!

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

Итак, MySQL предоставляет только произвольный id. Я ожидаю, что запрос агрегации будет выглядеть следующим образом:

SELECT instrumento_id, MAX(fecha_hora_carga) AS fecha_hora_carga
FROM calibraciones_instrumentos
GROUP BY instrumento_id;

Или, если вы хотите строку с максимальным fecha_hora_carga для каждого instrumento_id, используйте фильтрацию:

select ci.*
from calibraciones_instrumentos ci
where ci.fecha_hora_carga = (select max(ci2.fecha_hora_carga)
                             from calibraciones_instrumentos ci2
                             where ci2.instrumento_id = ci.instrumento_id
                            );
1 голос
/ 31 января 2020

Это потому, что ваш запрос неверен

MAX является агрегатной функцией и получает макс. значение из fecha_hora_carga, это не даст вам соответствующего идентификатора, оно просто получит максимальное значение, хранящееся в столбце fecha_hora_carga, а не в строке.

См. следующий пример:

mysql>CREATE TABLE test_group_by (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, val1 INT, val2 INT);`

mysql>INSERT INTO test_group_by (val1, val2) VALUES(10,1), (6, 1), (18, 1), (22, 2), (4, 2);

mysql> SELECT * FROM test_group_by;
+----+------+------+
| id | val1 | val2 |
+----+------+------+
|  1 |   10 |    1 |
|  2 |    6 |    1 |
|  3 |   18 |    1 |
|  4 |   22 |    2 |
|  5 |    4 |    2 |
+----+------+------+

mysql> SELECT id, MAX(val1) FROM test_group_by GROUP BY val2;
+----+-----------+
| id | MAX(val1) |
+----+-----------+
|  1 |        18 |
|  4 |        22 |
+----+-----------+

Как видно из примера, это упрощенное представление вашей таблицы. Функция MAX не получает запись, только макс. Значение всех записей в таблице. Но ваш запрос также запрашивает идентификатор, он просто составляет его (какой идентификатор не может быть точно сказано).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...