首页 > 解决方案 > 选择一列中的最大值加上同一表中的其他列

问题描述

我遇到了一个结构如下的数据库表:每次用户登录时,都会在数据库中添加一条新记录,其中包含他们的用户名、设备、登录的 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 列的最大值,但也要获得整行?

标签: sqlsql-servergroup-bysql-server-2012max

解决方案


不要认为“聚合”。想想“过滤”。然后:

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;

推荐阅读