多表连接场景下如何按日期筛选用户最新关联记录
解决多表连接后获取每个用户最新Table1记录的问题
你可以使用**ROW_NUMBER()**窗口函数来为每个用户的Table1记录按日期降序编号,筛选出编号为1的记录就能得到每个用户的最新一条数据。
具体查询语句
SELECT userid, Col1, Col2, Col3 FROM ( SELECT u.userid, Table1.Col1, Table1.Col2, Table1.Col3, -- 按用户分组,每条记录按Table1.Date降序编号 ROW_NUMBER() OVER (PARTITION BY u.UserId ORDER BY Table1.Date DESC) AS rn FROM Table1 JOIN Table2 ON Table2.PK = Table1.FK JOIN [User] u ON Table2.UserId = u.UserId WHERE u.UserId IN (2,4,6,7,10,11,12,8,5) ) AS ranked -- 只保留每个用户的第一条(最新)记录 WHERE rn = 1;
逻辑说明
PARTITION BY u.UserId:将数据按用户ID分组,每个用户的记录单独排序ORDER BY Table1.Date DESC:在每个用户组内,按Table1的日期从新到旧排序ROW_NUMBER():为每个组内的记录分配序号,最新的记录序号为1- 外层查询筛选
rn=1的记录,即可得到每个用户对应的最新Table1数据
替代方法(关联子查询)
如果你的SQL版本不支持窗口函数,也可以用关联子查询获取每个用户的最新日期,再关联回原表:
SELECT u.userid, Table1.Col1, Table1.Col2, Table1.Col3 FROM Table1 JOIN Table2 ON Table2.PK = Table1.FK JOIN [User] u ON Table2.UserId = u.UserId WHERE u.UserId IN (2,4,6,7,10,11,12,8,5) AND Table1.Date = ( SELECT MAX(t1.Date) FROM Table1 t1 JOIN Table2 t2 ON t2.PK = t1.FK WHERE t2.UserId = u.UserId );
这种方法通过子查询找到每个用户的最新Table1日期,再匹配对应的记录,适合不支持窗口函数的老版本SQL。
内容的提问来源于stack exchange,提问作者jmath412
相关产品推荐
相关产品推荐

