代码之家  ›  专栏  ›  技术社区  ›  IrvineCAGuy

加入用户的SQL语句和上次登录日期、位置

sql
  •  0
  • IrvineCAGuy  · 技术社区  · 7 年前

    我有两个表,一个是用户列表,一个是UserLoginHistory表,其中包含用户登录日期、IP地址和地理位置的历史记录。
    我想创建一个SQL语句,它将返回每个用户一个+他们最后的登录日期和地理位置。

      Users.UserId, Users.Name
         100        Bill
         101        Steve
    
      UserLoginHx.UserId, UserLoginHx.LoginDate, UserLoginLocation
        100               1/1/2018               New York
        101               1/1/2018               Los Angeles
        100               1/4/2018               Chicago
        101               1/5/2018               Denver
        ....
    

    此示例中所需的结果应返回两行:

        100  Bill  1/4/2018   Chicago
        101  Steve 1/5/2018   Denver
    

    谢谢。(到目前为止还没有人接近)

    4 回复  |  直到 7 年前
        1
  •  1
  •   Fahmi    7 年前

    尝试以下查询:

    select UserLoginHx.UserId,users.name,a.logindate,a.location from UserLoginHx
    inner join 
    (select UserLoginHx.UserId,max(UserLoginHx.LoginDate) as logindate
    from UserLoginHx
    group by UserLoginHx.UserId)a on a.UserId=UserLoginHx.UserId and a.logindate=UserLoginHx.LoginDate
    inner join Users on Users.UserId=UserLoginHx.UserId
    
        2
  •  0
  •   Rishikesh Dhokare    7 年前
    SELECT u.UserId, u. Name, ulh.LoginDate, ulh.UserLoginLocation
    FROM Users u
    JOIN UserLoginHistory ulh ON u.UserId = ulh.UserId
    
        3
  •  0
  •   Zaynul Abadin Tuhin    7 年前

    JOIN子句用于根据两个或多个表之间的相关列组合表中的行。

    所以你需要 join 两张桌子

    SELECT u.*, uh.LoginDate, uh.UserLoginLocation
    FROM Users u
    JOIN UserLoginHistory uh ON u.UserId = uh.UserId
    
        4
  •  0
  •   IShubh    7 年前

    尝试以下查询-:

    with cte as
    (
    select a.*,LoginDate,UserLoginLocation,
    ROW_NUMBER() over (partition by a.UserId order by Login desc) rn   
    from Users a 
    join UserLoginHistory  b 
    on a.UserId=b.UserId
    )select * from cte where rn=1
    

    SQL服务器