MySQL сгруппировать с максимальным значением - PullRequest
0 голосов
/ 13 апреля 2020

Привет, у меня есть эта таблица.

id  lat     lng     userId
1   12      23      1
2   45      34      2
3   42      34      3
4   33      34      1
5   36      79      2
6   53      98      2
7   23      90      3
8   23      67      1

Здесь у нас три пользователя. (идентификаторы пользователей 1,2,3). Я хочу получить позднюю запись (максимальное значение столбца идентификатора) каждого пользователя. Мой исключенный вывод - это

userId  lat     lng
1       23      67
2       53      98
3       23      90

Этот запрос даст мне группу по опции

SELECT 
    *
FROM
    covid.locations
GROUP BY userId;

Но как мне объединить это с функцией MAX(id).

Ответы [ 2 ]

4 голосов
/ 13 апреля 2020

Одним из способов является использование следующего:

SELECT
    cl.*
FROM covid.locations cl
INNER JOIN (
        SELECT
            userid
          , MAX( id ) mid
        FROM covid.locations
        GROUP BY
            userId
    ) g ON cl.userid = g.userid
    AND cl.id = cl.mid

Другим является использование row_number() over()

SELECT
    userId
  , lat
  , lng
FROM (
    SELECT
        *
      , ROW_NUMBER() OVER (PARTITION BY userid ORDER BY id DESC) rn
    FROM covid.locations
    GROUP BY
        userId
) d
WHERE rn = 1

Оба идентифицируют «самую последнюю» строку в исходной таблице на основе в столбце id этой таблицы. Обратите внимание, что для второго запроса требуется MySQL версия 8+, поскольку именно тогда row_number() стало поддерживаться в этой базе данных. Первый запрос должен выполняться в БД, поддерживающих SQL.

2 голосов
/ 13 апреля 2020

Это будет делать

SELECT
*
FROM
covid.locations
where id in (select max(t.id) from covid.locations t group by t.userId)
order by id desc;

Пример вышеуказанного запроса можно найти в этом SQLFiddle

...