답변을 위해 unpivot을 사용하지 않았으므로 정확히 찾고있는 내용이 아닐 수도 있습니다. 귀하의 자산 테이블과 거래 테이블의 예를 생각해 볼 때 순위를 사용하여 각 기계에 대한 처음 두 트랜잭션 만 선택하기로 결정했습니다. 마지막 두 가지 작업을 원할 경우 순서대로 순위를 변경할 수 있습니다.
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;