这基本上是分组最大查询和反向枢轴的组合。简单的方法是使用ROW_NUMBER
and UNPIVOT
。
我将向您展示如何在某个日期执行此操作。要执行两个日期,它基本上只是复制并粘贴第二个日期参数并在列的末尾加入FieldName
。您还没有发布任何描述架构,因此我假设您有一个名为的表,该表FieldDescription
将 映射FldID
到其对应的名称(例如HistoryDetail
)。
;WITH A_CTE AS
(
SELECT
fd.FieldName, a.Words,
ROW_NUMBER() OVER (PARTITION BY a.FldID ORDER BY a.Rev DESC) AS RowNum
FROM TableA a
INNER JOIN FieldDescription fd
ON fd.FldID = a.FldID
WHERE AddedDate <= @Date
),
B_CTE AS
(
SELECT
IterationPath,
CAST(ChangedDate AS nvarchar(4000)) AS ChangedDate,
CAST(Rev AS nvarchar(4000)) AS Rev,
CAST(ChangedBy AS nvarchar(4000)) AS ChangedBy,
CAST(AssignedTo AS nvarchar(4000)) AS AssignedTo,
ROW_NUMBER() OVER
(
PARTITION BY Rev
ORDER BY ChangedDate DESC
) AS RowNum
FROM TableB
WHERE ChangedDate <= @Date
),
Props AS
(
SELECT PropertyName, PropertyValue
FROM B_CTE
UNPIVOT
(
PropertyValue
FOR PropertyName IN
(
IterationPath, ChangedDate, Rev, ChangedBy, AssignedTo
)
) AS u
WHERE RowNum = 1
)
SELECT FieldName, Words
FROM A_CTE
WHERE RowNum = 1
UNION ALL
SELECT PropertyName, PropertyValue
FROM Props