Выберите максимальное значение в одном столбце плюс другие столбцы в той же таблице - PullRequest
0 голосов
/ 24 марта 2020

Я наткнулся на таблицу базы данных, структурированную так: каждый раз, когда пользователь входит в систему, в базу данных добавляется новая запись с его именем пользователя, устройством, unix меткой времени входа в систему и 10 другими столбцами. Для каждого пользователя я хочу выбрать его самый последний логин. Итак, я делаю это:

with query1 as (
    select 
        user,
        MAX(last_login)
    from 
        users_table 
    group by 
        user
)

В качестве проверки каждый пользователь связан только с одной строкой, его последний логин:

select count(distinct user) from query1  == select count(user) from query1

В этом и заключается проблема. Я хочу добавить еще один столбец к выбору, поэтому я добавляю к group by тоже ...

with query1 as (
    select 
        user,
        device,  
        MAX(last_login)
    from 
        users_table 
    group by 
        user,
        device
)

тогда длины не равны. По той причине, что я спрашиваю об этом, некоторые пользователи связаны с одной строкой, а некоторые пользователи связаны с несколькими строками.

select count(distinct user) from query1  != select user from query1 

Есть ли что-то, что я не рассматриваю, так как хочу выбрать максимальное значение 1 столбца, но также получить всю строку?

1 Ответ

1 голос
/ 24 марта 2020

Не думай "агрегация". Подумайте «фильтрация». Тогда:

select u.*
from users_table u
where u.last_login = (select max(u2.last_login)
                      from users_table u2
                      where u2.user = u.uer
                     );

Если вы хотите гарантировать одну строку на пользователя, вы можете использовать row_number():

select u.*
from (select u.*
             row_number() over (partition by user order by last_login desc) as seqnum
      from users_table u
     ) u
where seqnum = 1;
...