在另一个表中查找最新的匹配项

时间:2016-04-27 19:09:11

标签: sql sql-server join

考虑以下两个表,分别名为tbl_userstbl_actions

user_id     user_name     capture_date
u123        John Smith       2016-04-01
u124        Hannah Montana   2015-10-07
u125        James Bond       2014-07-28


user_id     user_alias      use_date
u123         Jonathan Smith  2012-01-01
u125         Double-O Seven  2012-02-04
u125         O-O-Seven       2015-11-25

我想和他们一起加入他们,以便找到"最新使用的"在捕获日期之前的每个用户的别名。所以预期的输出是:

user_id     user_name     capture_date   latest_alias_by_then
u123        John Smith       2016-04-01     Jonathan Smith
u124        Hannah Montana   2015-10-07
u125        James Bond       2014-07-28     Double-O Seven

你如何在SQL中有效地做到这一点?我正在使用Microsoft SQL Server,因此也可以使用OVER和RANK等功能。

1 个答案:

答案 0 :(得分:2)

SELECT  *
FROM    (
        SELECT  u.*, a.user_alias,
                ROW_NUMBER() OVER (PARTITION BY u.user_id ORDER BY a.use_date DESC) rn
        FROM    tbl_users u
        LEFT JOIN
                tbl_actions a
        ON      a.user_id = u.user_id
                AND a.use_date <= u.capture_date
        ) q
WHERE   rn = 1

SELECT  *
FROM    tbl_users u
OUTER APPLY
        (
        SELECT  TOP 1
                user_alias
        FROM    tbl_actions a
        WHERE   a.user_id = u.user_id
                AND a.use_date <= u.capture_date
        ORDER BY
                use_date DESC
        ) q

tbl_actions (user_id, use_date)上创建索引,以使查询更快地运行。

这些方法中的任何一种都可以比另一种方法更有效,具体取决于您拥有的用户数量和每个用户的操作数量。