sql Максимальное значение по группе

id name
1 Саша
2 Миша
id date country
1 01.01.2021 РФ
1 01.02.2021 США
2 01.03.2021 РФ
2 01.02.2021 Перу

Привет! Есть две таблицы, юзер и его входы в систему. Нужно составить запрос, который будет показывать страну последнего входа по каждому юзеру.

Я посчитал максимальное значение даты, как последнее и вывел имя пользователя, но страну добавить не получается в лоб - она не входит в группировку. Я так понимаю нужен подзапрос но не понимаю как его вкрутить.

SELECT t1.name, MAX(t2.date)
FROM t1, t2
WHERE t1.id = t2.id
GROUP BY t1.name

Ответы (2 шт):

Автор решения: Андрюха
SELECT a.name,b.country FROM 
(SELECT t1.name,t1.id, MAX(t2.date) as maxd FROM t1, t2 WHERE t1.id = t2.id GROUP BY t1.name) as a, t2 as b 
WHERE b.id=a.id AND a.maxd=b.date

ваш подзапрос практически без изменений, обернут еще связями с исходной таблицей t2. Еще можно было не джойнить таблицу t1 в группируемом подзапросе, а приджойнить потом. Например, так

SELECT t1.name,b.country FROM 
(SELECT t2.id, MAX(t2.date) as maxd FROM t2 GROUP BY t2.id) as a, 
t2 as b, t1 
WHERE b.id=a.id AND t1.id=a.id and a.maxd=b.date
→ Ссылка
Автор решения: Виталий Яндулов

Запускалось в Oracle. После группировки повторно джойнимся на себя.

with
  t1 as (
    SELECT 1 id, 'Саша' name from dual UNION ALL
    SELECT 2 id, 'Миша' name from dual
  ),
  t2 as (
    SELECT 1 id, DATE '2021-01-01' "DATE", 'РФ'   country from dual UNION ALL
    SELECT 1 id, DATE '2021-02-01' "DATE", 'США'  country from dual UNION ALL
    SELECT 2 id, DATE '2021-03-01' "DATE", 'РФ'   country from dual UNION ALL
    SELECT 2 id, DATE '2021-02-01' "DATE", 'Перу' country from dual
  )
SELECT a.name
     , t2.country
  FROM (  SELECT t1.name
               , t1.id
               , MAX(t2."DATE") AS maxd
            FROM t1
               , t2
           WHERE t1.id = t2.id
        GROUP BY t1.name
               , t1.id) a
     , t2
 WHERE t2.id = a.id
   AND t2."DATE" = a.maxd;
→ Ссылка