检索指定日期的最新修订信息(SQL)

时间:2010-03-03 19:33:14

标签: sql sql-server tsql sql-server-2008 greatest-n-per-group

alt text

在上面的FldID 52 =说明和FldID 54 = HistoryDe​​tail

alt text

对于任何给定日期,输出应该是该日期的最后一个条目。列也需要成为行。 用户将提供2个日期。比如2010年3月2日和2010年3月3日。

因此上述案例中的输出应为

alt text

由于Rev 6在表A中没有FldID 52的条目,[占位符1]应该具有Rev 3中的单词(因为这是表A中FldID 52的Rev 6之前的最新内容)。

类似地,
由于Rev 6在表A中没有FldID 54的条目,[占位符2]应该具有Rev 5中的单词(因为这是表A中FldID 54的Rev 6之前的最新内容)。

由于Rev 8在表A中没有FldId 54的条目,[占位符3]应该具有Rev 7中的单词(因为这是表A中FldID 54的Rev 8之前的最新内容)。

我无法提出可以提供上述结果的查询。请帮忙。

更新

表B中字段的数据类型

alt text

2 个答案:

答案 0 :(得分:1)

这基本上是分组最大查询和反向枢轴的组合。简单的方法是使用ROW_NUMBERUNPIVOT

我会告诉你如何在一个日期做到这一点。要做两个日期,基本上只需复制并粘贴第二个日期参数和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

答案 1 :(得分:0)

SELECT 
LAST(System.ChangedDate) as ChangedDate,
LAST(System.Rev) as Rev,
LAST(System.ChangedBy) as ChangedBy,
LAST(System.AssignedTO) AS AssignedTO,
LAST(System.IterationPath) AS IterationPath,
LAST(A1.Description) AS Description,
LAST(A2.Description) AS HistroyDetail
FROM TableB
JOIN TableA on TableB.Id=TableA.ID AND TableB.(datefunction)=TableA=(datefunction) 
AND FldID=52 AS A1
JOIN TableA on TableB.Id=TableA.ID AND TableB.(datefunction)=TableA=(datefunction) 
AND fldID=54 AS A2
WHERE (datefunction) >= (minimum date) and (datefunction) <= (minimum date);
ORDER BY ChangedDate
GROUP BY (datefunction)

将datefunction替换为提取日期的函数,并从datetime字段中忽略Time。 这将给出一个类似你想要的表格,但90度关闭。