Dies ist möglicherweise nicht genau das, was Sie suchen, da ich nicht pivot für die Antwort verwenden. Angesichts Ihres Beispiels einer Vermögenswerttabelle und einer Transaktionstabelle entschied ich mich, den Rang zu verwenden, um nur die ersten zwei Transaktionen für jede Maschine auszuwählen. Sie können die Rangfolge nach "Desc" ändern, wenn Sie die letzten beiden Aktionen möchten.
DECLARE @machine TABLE
(
machineName VARCHAR(50)
, serialNumber VARCHAR(50)
);
INSERT INTO @machine
(
machineName
, serialNumber
)
VALUES
('ABC', '1234')
, ('XYZ', '4321')
, ('YYZ', '2112');
DECLARE @machineAction TABLE
(
machineName VARCHAR(50)
, machineAction VARCHAR(50)
, actionTime TIME
);
INSERT INTO @machineAction
(
machineName
, machineAction
, actionTime
)
VALUES
('XYZ', 'Installed', '22:50:07')
, ('XYZ', 'Replaced', '23:44:22')
, ('ABC', 'Installed', '05:11:01')
, ('YYZ', 'Installed', '02:50:07')
, ('YYZ', 'Replaced', '06:44:22')
, ('YYZ', 'Removed', '10:33:12');
WITH cte_actionRank
AS (
SELECT ma.machineName
, ma.machineAction
, ma.actionTime
, seq = RANK() OVER (PARTITION BY ma.machineName ORDER BY ma.actionTime)
FROM @machineAction AS ma
)
SELECT machine = m.machineName
, m.serialNumber
, action1 = a1.machineAction
, action1Time = a1.actionTime
, action2 = a2.machineAction
, action2Time = a2.actionTime
FROM @machine AS m
LEFT OUTER JOIN cte_actionRank AS a1
ON m.machineName = a1.machineName
AND a1.seq = 1
LEFT OUTER JOIN cte_actionRank AS a2
ON a1.machineName = a2.machineName
AND a2.seq = 2;