我覺得這個方法,用CROSS APPLY
最接近的問題描述要解決:
declare @ta table (Visit int not null, Bill int not null, TransactionDate date not null)
insert into @ta (Visit,Bill,TransactionDate) values
(1,1,'20161220')
declare @tb table (Bill int not null, CodeID char(1) not null,
EffectiveCodeDate date not null, Code varchar(5) not null)
insert into @tb (Bill,CodeID,EffectiveCodeDate,Code) values
(1,'A','20150901','ABCDE'),
(1,'B','20150901','FGHI'),
(1,'C','20150901','JKLM'),
(1,'A','20161001','ZQMOP'),
(1,'B','20161001','XYZNP'),
(1,'C','20161001','EFGHI')
select
*
from
@ta a
cross apply
(select *,ROW_NUMBER() OVER (PARTITION BY CodeID ORDER by EffectiveCodeDate desc) as rn
from @tb b
where
b.Bill = a.Bill and
b.EffectiveCodeDate < a.TransactionDate) p
where
rn = 1
也就是說,在每一行表B,並且對於每個不同的CodeID
值,我們要選擇比表A早於TransactionDate
的最新行。
結果:
Visit Bill TransactionDate Bill CodeID EffectiveCodeDate Code rn
----------- ----------- --------------- ----------- ------ ----------------- ----- --------------------
1 1 2016-12-20 1 A 2016-10-01 ZQMOP 1
1 1 2016-12-20 1 B 2016-10-01 XYZNP 1
1 1 2016-12-20 1 C 2016-10-01 EFGHI 1
(作爲練習修剪結果集到你需要的列)
你嘗試過這麼遠嗎?從你上面的例子來看,它們都不應該被返回,因爲它們都不是在交易日期之後。 – Eric
@Eric對不起,我的意思是我需要返回最接近交易日期的生效日期的CodeID和代碼。例如:由於交易日期是2016年12月20日,我需要10/01/2016代碼。如果交易日期爲2015年9月2日,我需要返回生效日期爲2015年9月1日的代碼。我還沒有嘗試過任何東西。我沒有代碼。 – cmpmd2
您的第一張桌子;它只包含一個值嗎?根據該表中的其他內容,對您的問題的各種答案可能會產生意外數量的行。 – Xedni