考虑以下两个表,分别名为tbl_users
和tbl_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等功能。
答案 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)
上创建索引,以使查询更快地运行。
这些方法中的任何一种都可以比另一种方法更有效,具体取决于您拥有的用户数量和每个用户的操作数量。