@vladimir_avshtolis

Как получить последнее значение поля при группировке по другому полю?

Как оптимальным способом реализовать действие функции LAST, которой нет в mysql?
id uid utm
1 10 test1
2 10 test2
3 10 test3
SELECT uid,utm FROM table WHERE 1 GROUP BY uid
как сделать чтобы запрос вернул test3, а не test1 ?
  • Вопрос задан
  • 1062 просмотра
Пригласить эксперта
Ответы на вопрос 3
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
-- using window functions
select distinct 
	uid, first_value(utm) over (partition by uid order by id desc) last_utm
from t;

-- using join 
select t.uid, t.utm last_utm
from t
join (
	select max(id) max_id from t group by uid
) max_ids on max_id = id;


-- using sub-query
select t.uid, t.utm last_utm
from t
where id = (select max(id) max_id from t group by uid having max(id) = t.id);


SQL online
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для начала определиться, что значит "последний". Отношение следования в SQL необходимо задавать явно через ORDER BY.
Затем использовать оконные функции и общие табличные выражения.
https://dev.mysql.com/doc/refman/8.0/en/window-fun...
https://dev.mysql.com/doc/refman/8.0/en/with.html
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега PHP
Конкретно в таком примере (если есть гарантия, что utm-значения идут по возрастающей) будет работать и так:
SELECT 
    `uid`,
    MAX(`utm`) AS 'utm' 
FROM 
    `table`
GROUP BY 
    `uid`


Чтобы получить честную сортировку по id, понадобится GROUP_CONCAT
SELECT 
    `uid`,
    LEFT(GROUP_CONCAT(`utm` ORDER BY id DESC), LOCATE(',', GROUP_CONCAT(`utm` ORDER BY id))-1) AS 'utm'
FROM 
    `table`
GROUP BY 
    `uid`


PS Если обновишься до 10.3.3, то и LIMIT заработает и можно уже будет писать так:
SELECT 
    `uid`,
    GROUP_CONCAT(`utm` ORDER BY id DESC LIMIT 1) AS 'utm'
FROM 
    `table`
GROUP BY 
    `uid`
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы