在SQL Server 2008中,我想根据日期顺序连接两个表。更具体地说,我需要通过以下规则将Payments
表连接到Profiles
表:
UserId
必须匹配。
Payments
中的每条记录都与Profiles
中与Profiles.CreationDate
之前最接近Payments.PayDate
的记录相匹配。
有关简化示例,
Table Payments:
UserId PayDate Amount
1 2012 400
1 2010 500
2 2014 600
Table Profiles:
UserId CreationDate Address
1 2009 NY
1 2015 MD
2 2007 NJ
2 2013 MA
3 2008 TX
Desired Result:
UserId CreationDate PayDate Amount Address
1 2009 2010 500 NY
1 2009 2012 400 NY
2 2013 2014 600 MA
保证用户在付款前至少有1 Profiles
条记录。另一个限制是我没有授权在数据库中写任何东西。
我的想法是首先将Payments
加入Profiles
,然后在匹配每个(UserId, PayDate)
元组的记录组中,按CreationDate
排序,然后选择最后一条记录。但我不知道如何用SQL语言实现它,还是有更好的方法来进行这种合并?
答案 0 :(得分:2)
使用Outer Apply
执行此操作。
SELECT py.UserId,
CreationDate,
PayDate,
Amount,
Address
FROM Payments py
OUTER APPLY (SELECT TOP 1 *
FROM Profiles pr
WHERE py.UserId = pr.UserId
and PayDate> CreationDate
ORDER BY CreationDate desc) cs