私は答えにピボットを使用していないので、これはあなたが探しているものと正確に一致しない場合があります。アセットテーブルとトランザクションテーブルの例を考えて、ランクを使用して各マシンの最初の2つのトランザクションだけを選択することにしました。最後の2つのアクションが必要な場合は、順序を変更して順序を変更できます。
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;