2017-08-26 65 views
1

我需要填充@firstParty最佳匹配@thirdPartySQL Server数据集之间的最佳日期匹配

要匹配的记录,@firstParty.Registered必须在@thirdParty.Registered的31天内。

此外,@thirdParty的任何记录都不能与@firstParty中的多条记录相关联。

我想尽可能有效地做到这一点。 SQL Server版本是2008年,所以在后面介绍的功能无法使用。

此示例代码是实际的代码,我不能张贴的简化:

declare @firstParty table 
(
    FirstPartyId integer identity, 
    Registered date, 

    MinThirdPartyId integer, 
    MinThirdPartyRegistered date 

); 

insert into @firstParty (Registered) 
values 
('1/1/2017'), ('2/1/2017'), ('3/1/2017'), ('4/1/2017'), ('5/1/2017'), ('6/1/2017'); 

/* 
dates in @firstParty and @thirdParty are not guaranteed to be unique 
in all scenarios 
*/ 

declare @thirdParty table 
(
    ThirdPartyId integer identity, 
    Registered date 
); 

insert into @thirdParty (Registered) 
values 
('03/02/2017'), ('04/30/2017'); 


declare @x integer = 1; 
while @x <= (select max(FirstPartyId) from @firstParty) begin 

    declare @MinRegistered date = null; 

    --get minimum third party date within 31 days of registered date, that hasn't been used 
    select 
     @MinRegistered = min(tp.Registered)  
    from 
     @firstParty fp 
     join @thirdParty tp on 
      fp.Registered between dateadd(d, -31, tp.Registered) and dateadd(d, 31, tp.Registered) 
     left join @firstParty used on tp.ThirdPartyId = used.MinThirdPartyId 
    where 
     fp.FirstPartyId = @x 
     and used.MinThirdPartyId is null; 

    declare @MinThirdPartyId integer = null; 

    --get earliest ID of third party record with @MinRegistered 
    select top 1 
     @MinThirdPartyId = tp.ThirdPartyId 
    from 
     @firstParty fp 
     join @thirdParty tp on 
      tp.Registered = @MinRegistered 
     left join @firstParty used on tp.ThirdPartyId = used.MinThirdPartyId 
    where 
     fp.FirstPartyId = @x 
     and used.MinThirdPartyId is null 
    order by 
     tp.Registered, 
     tp.ThirdPartyId; 


    update @firstParty 
    set 
     MinThirdPartyId = @MinThirdPartyId, 
     MinThirdPartyRegistered = @MinRegistered 
    where 
     FirstPartyId = @x; 


    set @x = @x + 1; 

end; 


select 
    fp.FirstPartyId, 
    fp.Registered, 
    fp.MinThirdPartyId, 
    fp.MinThirdPartyRegistered 
from 
    @firstParty fp; 

这里是我想要的结果:

FirstPartyId Registered MinThirdPartyId MinThirdPartyRegistered 
------------ ---------- --------------- ----------------------- 
1   2017-01-01 NULL   NULL 
2   2017-02-01 NULL   NULL 
3   2017-03-01 1    2017-03-02 
4   2017-04-01 NULL   NULL 
5   2017-05-01 2    2017-04-30 
6   2017-06-01 NULL   NULL 

首先填充所有匹配的方法然后删除非最佳匹配将不起作用,因为如果删除@ firstParty的最优@ thirdParty记录,那么@thirdParty中可能有不同的记录,这仍然是可接受的匹配。

回答

1

也许像这样?

Select A.FirstPartyId 
     ,A.Registered 
     ,MinThirdPartyId = B.ThirdPartyId 
     ,MinThirdPartyRegistered = B.Registered 
From @firstParty A 
Left Join (
       Select B1.* 
         ,MinPartyID =B2.FirstPartyID 
       From @thirdParty B1 
       Cross Apply (
           Select Top 1 with ties * 
           From @firstParty 
           Where abs(DateDiff(DAY,B1.Registered,Registered))<=31 
           Order By abs(DateDiff(DAY,B1.Registered,Registered)) 
          ) B2 
      ) B 
    on (B.MinPartyID=A.FirstPartyId) 

返回

enter image description here

+0

完美。谢谢! –

+0

@BenOsborne乐于帮助 –

相关问题