MYSQL - Group BY с MAX выпуском - PullRequest
1 голос
/ 27 марта 2012

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

  Date, TelephoneNumber, Type
  02/02/12, 123456, b
  04/02/12, 123456, b
  07/02/12, 123456, a
  03/02/12, 789999, a
  15/02/12, 789999, b

При запуске следующего SQL

        select TelephoneNumber, max(Date) as datetime, Type
        from Table1
        where Date > '2012-03-25 00:00'
        group by TelephoneNumber
        order by date desc;

Я заметил, что тип не соответствует связанной с ним дате. Например я получаю

  07/02/12, 123456, b
  15/02/12, 789999, a

Кажется, что она берет первую запись в Type .... даже когда я сортировал наоборот. Может кто-нибудь, пожалуйста, помогите мне, как я могу решить эту проблему? Я использую MySQL

Спасибо заранее. Сандро

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Этот вопрос, кажется, всплывает довольно часто.

Вот мое решение:

SELECT TelephoneNumber, Date AS datetime, Type
from ( SELECT *
       FROM Table1
       WHERE Date > '2012-03-25 00:00'
       ORDER BY Date DESC) AS h
GROUP BY TelephoneNumber
ORDER BY date DESC;

Проверьте объяснение здесь

2 голосов
/ 27 марта 2012

Это связано с тем, что §11.16.3 «GROUP BY и HAVING со скрытыми столбцами» в MySQL 5.6 Справочное руководство означает:

MySQL расширяет использование GROUP BY, так что список выбора может ссылаться на неагрегированные столбцы, не указанные в предложении GROUP BY.Это означает, что предыдущий запрос является допустимым в MySQL.Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов.Однако это полезно, прежде всего, когда все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы. Сервер может свободно выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными. Кроме того, на выбор значений из каждой группы нельзя повлиять, добавив предложение ORDER BY,Сортировка результирующего набора происходит после выбора значений, и ORDER BY не влияет на то, какие значения выбирает сервер.

[выделение шахты]

Вместо этого вам нужно написатьчто-то вроде этого:

select t1a.TelephoneNumber, t1a.Date, t1a.Type
  from Table1 as t1a
  left
  join Table1 as t1b
    on t1b.TelephoneNumber = t1a.TelephoneNumber
   and t1b.Date > t1a.Date
 where t1a.Date > '2012-03-25 00:00'
   and t1b.TelephoneNumber IS NULL                -- i.e., the join failed
;

, чтобы найти запись с наибольшим Date для каждого значения TelephoneNumber.

0 голосов
/ 27 марта 2012

Заказ применяется после группировки. Значение max (Date) уже вычислено, вы его никак не сортируете. Кроме того, что такое msisdn? Невозможно сказать, что происходит с вашим запросом, потому что то, что вы на самом деле группируете, непрозрачно.

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