根据日期顺序连接两个表

时间:2015-01-06 17:25:00

标签: sql-server

在SQL Server 2008中,我想根据日期顺序连接两个表。更具体地说,我需要通过以下规则将Payments表连接到Profiles表:

  1. UserId必须匹配。

  2. Payments中的每条记录都与Profiles中与Profiles.CreationDate之前最接近Payments.PayDate的记录相匹配。

  3. 有关简化示例,

    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语言实现它,还是有更好的方法来进行这种合并?

1 个答案:

答案 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 

SQLFIDDLE DEMO