CREATE TABLE #CONTACT ( ACCOUNTNO VARCHAR(5), COMPANY VARCHAR(50), CONTACT VARCHAR(50), RECID VARCHAR(5) ) CREATE TABLE #HISTORY ( ACCOUNTNO VARCHAR(5), LASTUSER VARCHAR(8), LASTDATE DATE, RECID VARCHAR(5) )INSERT INTO #CONTACT (ACCOUNTNO, COMPANY, CONTACT, RECID)SELECT 'C1', 'ACME', 'WILEY COYOTE', 'CR1' UNION ALLSELECT 'C2', 'Beta Ltd', 'Joe Soap', 'CR2'INSERT INTO #HISTORY (ACCOUNTNO, LASTUSER, LASTDATE, RECID)SELECT 'C1', 'JOE', '20120101', 'HR1' UNION ALLSELECT 'C1', 'BOB', '20120101', 'HR2' UNION ALLSELECT 'C1', 'JOE', '20120201', 'HR3' UNION ALLSELECT 'C2', 'JOE', '20120202', 'HR4' UNION ALLSELECT 'C2', 'BOB', '20120202', 'HR5'
SELECT c.*, h.* FROM #Contact c INNER JOIN ( SELECT h1.Accountno, h1.LastDate, RECID = MIN(h1.RECID) FROM #History h1 INNER JOIN ( SELECT Accountno, MAX(LastDate) LastDate FROM #History GROUP BY Accountno ) l ON l.Accountno = h1.Accountno AND l.LastDate = h1.LastDate GROUP BY h1.Accountno, h1.LastDate) hON h.Accountno = c.Accountno
select C_RECID, H_RECID from(select C.RECID C_RECID, H.RECID H_RECID, row_number() over (partition by H.ACCOUNTNO order by H.RECID desc) history_rankfrom #CONTACT Cjoin #HISTORY H on H.ACCOUNTNO = C.ACCOUNTNO) xwhere history_rank = 1;
select C_RECID, H_RECID from(select C.RECID C_RECID, H.RECID H_RECID, (select count(*) from #HISTORY HX where HX.ACCOUNTNO = H.ACCOUNTNO and HX.RECID >= H.RECID) history_rankfrom #CONTACT Cjoin #HISTORY H on H.ACCOUNTNO = C.ACCOUNTNO) xwhere history_rank = 1;
CREATE TABLE #CONTACT ( ACCOUNTNO VARCHAR(5), COMPANY VARCHAR(50), CONTACT VARCHAR(50), RECID VARCHAR(5) ) CREATE TABLE #HISTORY ( ACCOUNTNO VARCHAR(5), LASTUSER VARCHAR(8), LASTDATE DATE, RECID VARCHAR(5) )INSERT INTO #CONTACT (ACCOUNTNO, COMPANY, CONTACT, RECID)SELECT 'C1', 'ACME', 'WILEY COYOTE', 'CR1' UNION ALLSELECT 'C2', 'Beta Ltd', 'Joe Soap', 'CR2'INSERT INTO #HISTORY (ACCOUNTNO, LASTUSER, LASTDATE, RECID)SELECT 'C1', 'JOE', '20120101', 'HR1' UNION ALLSELECT 'C1', 'BOB', '20120101', 'HR2' UNION ALLSELECT 'C1', 'JOE', '20120201', 'HR3' UNION ALLSELECT 'C2', 'JOE', '20120202', 'HR4' UNION ALLSELECT 'C2', 'BOB', '20120202', 'HR5'--Assuming that the RecID is sequential and ascendingselect C.*, H.*from #CONTACT Cleft join ( select Hi.* from #HISTORY Hi inner join ( select max(recid) Min_RecID, ACCOUNTNO from #HISTORY group by ACCOUNTNO ) S on Hi.ACCOUNTNO = S.ACCOUNTNO and Hi.RECID = S.Min_RecID ) Hon C.ACCOUNTNO = H.ACCOUNTNO--This works to get H1 and H4 but it implies that the recid is in descending order...select C.*, H.*from #CONTACT Cleft join ( select Hi.* from #HISTORY Hi inner join ( select min(recid) Min_RecID, ACCOUNTNO from #HISTORY group by ACCOUNTNO ) S on Hi.ACCOUNTNO = S.ACCOUNTNO and Hi.RECID = S.Min_RecID ) Hon C.ACCOUNTNO = H.ACCOUNTNOdrop table #Contactdrop table #History