如何根据 MA​​STER 条目获取最新的 DETAIL 条目?

How to get latest DETAIL entry against the MASTER entry?

我有 2 table

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

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

问题

第 2 个 table 对 User Master table id

有 n 行

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

例子 user_full_name、user_login、user_logout 等等...

如果您想要单个用户的结果,您可以使用简单的 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

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

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;

您可以尝试在 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
)