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;