【问题标题】:Select max value in one column plus other columns in same table选择一列中的最大值加上同一表中的其他列
【发布时间】:2020-07-04 11:56:13
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server group-by sql-server-2012 max


    【解决方案1】:

    不要认为“聚合”。想想“过滤”。那么:

    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;
    

    【讨论】:

    • 如果我在最后一次登录时使用 where 子句,如果两个用户最后一次登录的确切时间相同怎么办?
    • @e1v1s 。 . .最近一次登录是每个用户
    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多