This is a rewrite with over(). The performance will probably still be bad. Also some temp tables that mimic part of table structure shown in the query (some differences). EDIT: added LEAD() as to not use a left join. CREATE TABLE #TRANS(STATUSRECEIPT int, TRANSORIGIN int, DIMID int); INSERT INTO #TRANS values(0,1,1), (1,1,2),(0,2,3),(1,3,4) CREATE TABLE #TRANSORIGIN ( RECID int identity(1,1) PRIMARY KEY NOT NULL, CREATEDDATETIME datetime2 default getdate() , createdby nvarchar(255), REFERENCECATEGORY int); INSERT INTO #TRANSORIGIN(createdby,REFERENCECATEGORY) values('A',2),('A',6); WAITFOR DELAY '00:00:02' INSERT INTO #TRANSORIGIN(createdby,REFERENCECATEGORY) values('B',2),('B',6),('C',6); --ALTER TABLE #trans add constraint FK_TRANSORIGIN_TRANS foreign key (TRANSORIGIN) references #TRANSORIGIN(recid); not possible on temp tables CREATE TABLE #PALLETTABLE( PALLETID int, PALLETNUMBER varchar(10)); INSERT INTO #PALLETTABLE VALUES(1285952,'C2002'),(2,'C2002'),(3,'C2002'),(4,'C2002'); CREATE TABLE #PALLET(PALLETID int, PALLETNUMBER varchar(10)); INSERT INTO #PALLET VALUES(1285952,'C2002 '); --,(1285952,2),(3,3),(4,4) CREATE TABLE #DIM(DIMID int identity (1,1), PALLETID int, BATCHID int, LOCATIONID varchar(10)); INSERT INTO #DIM(PALLETID,BATCHID,LOCATIONID) VALUES(1285952,1,'CRK2'), (1285952 ,2,'300FR'), (1285952 ,3,'300FR'), (1285952 ,4,'23IS1'); CREATE TABLE #ORDER(Orderid int identity(1,1), DIMID int, DEPOTNAME nvarchar(255)); INSERT INTO #ORDER(DIMID,DEPOTNAME) VALUES(1,'DEPOT1'),(2,'DEPOT2'),(3,'DEPOT4'),(4,'DEPOT5'); ;WITH ITR AS ( SELECT CREATEDDATETIME , CREATEDBY , ITO.REFERENCECATEGORY , IT.STATUSRECEIPT, IT.DIMID FROM #TRANS IT INNER JOIN #TRANSORIGIN ITO ON IT.TRANSORIGIN = ITO.RECID AND ITO.REFERENCECATEGORY IN ( 2, 6 ) WHERE CREATEDDATETIME > DATEADD(MONTH, -1, GETDATE()) ), ITR2 as( SELECT LEAD(LOCATIONID) OVER ( PARTITION BY CREATEDDATETIME ORDER BY STATUSRECEIPT asc) as nextvalue, ROW_NUMBER() OVER ( PARTITION BY CREATEDDATETIME ORDER BY STATUSRECEIPT asc) as rownum, ITR.CREATEDDATETIME , ITR.CREATEDBY AS [User] , YPT.PALLETNUMBER AS PalletNumber , ID.LOCATIONID AS [Current Location] , ID.PALLETID AS Pallet , WOT.DEPOTNAME AS Depot , ITR.REFERENCECATEGORY , ITR.STATUSRECEIPT FROM #PALLETTABLE AS YPT INNER JOIN #PALLET AS WP ON YPT.PALLETID = WP.PALLETID LEFT OUTER JOIN #DIM AS ID ON WP.PALLETID = ID.PALLETID AND ID.BATCHID <> '' LEFT OUTER JOIN #ORDER AS WOT ON ID.DIMID = WOT.DIMID LEFT OUTER JOIN ITR ON ID.DIMID = ITR.DIMID) select ITR2.CREATEDDATETIME , ITR2.[User] , ITR2.PalletNumber , ITR2.[Current Location] , nextvalue, ITR2.Pallet , ITR2.Depot , ITR2.REFERENCECATEGORY , ITR2.STATUSRECEIPT FROM ITR2 where ITR2.rownum = 1; DROP TABLE #TRANS; DROP TABLE #TRANSORIGIN; DROP TABLE #PALLETTABLE; DROP TABLE #PALLET; DROP TABLE #DIM; DROP TABLE #ORDER;