【问题标题】:How to get latest DETAIL entry against the MASTER entry?如何针对 MASTER 条目获取最新的 DETAIL 条目?
【发布时间】:2015-12-24 18:15:49
【问题描述】:

我有两张桌子

1.用户大师 user_id、user_full_name、user_dob...等等

2。登录详情 login_id、login_user_id、login_time、login_date、logout_time

问题

第二个表有 n 行与用户主表 id 相对应

我需要加入,但条件是它应该只显示用户的最后一次登录数据

示例 user_full_name、user_login、user_logout 等等...

【问题讨论】:

  • 您希望针对特定用户还是所有用户?

标签: sql sql-server sql-server-2008 greatest-n-per-group


【解决方案1】:

您可以尝试在 JOIN 子句中使用 TOP 1:

SELECT a.user_id, a.user_full_name, b.login_id...
FROM UserMaster a INNER JOIN Logins b ON b.login_date =
(
    SELECT  TOP 1 login_date 
    FROM    Logins 
    WHERE   login_user_id = a.user_id
    ORDER BY login_date DESC
)

【讨论】:

    【解决方案2】:

    此问题的常见解决方案是使用row_number 窗口函数并过滤每个分区中行号为 1 的行(按用户,按日期/时间排序):

    WITH UserDetails AS (
        SELECT 
           *
           , ROW_NUMBER() OVER (PARTITION BY login_user_id 
                                ORDER BY login_date DESC, login_time DESC) AS RN
        FROM LoginDetails
    )
    SELECT * 
    FROM UserMaster  M
    JOIN UserDetails D ON M.user_id = D.login_user_id
    WHERE D.RN = 1;
    

    【讨论】:

      【解决方案3】:

      如果您想要单个用户的结果,您可以使用简单的INNER JOIN 结合ORDER BYTOP 1

      SELECT TOP 1 user_full_name, login_time, login_date, logout_time
      FROM Users INNER JOIN Logins ON
        Users.user_id = Logins.user_id
      WHERE
        Users.user_id = @user_id
      ORDER BY login_date DESC, login_time DESC
      

      (见SQLFiddle

      如果你想要所有用户的结果,你可以使用CROSS APPLY:

      SELECT user_full_name, l.*
      FROM Users u CROSS APPLY (
        SELECT TOP 1 login_time, login_date, logout_time
        FROM Logins
        WHERE
          u.user_id = Logins.user_id
        ORDER BY login_date DESC, login_time DESC
        ) l
      

      (见SQLFiddle

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多