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;