Получение самой последней информации о ревизии для указанных дат (SQL) - PullRequest
0 голосов
/ 03 марта 2010

alt text

В указанном выше FldID 52 = Описание и FldID 54 = HistoryDetail

alt text

Для любой данной даты выходные данные должны быть последней записью для этой даты. Также столбцы должны стать строками. Пользователь предоставит 2 даты. Скажите 2 марта 2010 года и 3 марта 2010 года.

Таким образом, вывод в вышеприведенном случае должен быть

alt text

Так как Rev 6 не имеет записи для FldID 52 в Таблице A, [Заполнитель 1] должен иметь Слова из Rev 3 (поскольку это последняя версия перед Rev 6 для FldID 52 в Таблице A).

* * Тысяча двадцать-один Аналогично, * * тысяча двадцать-дв Поскольку в Rev 6 нет записи для FldID 54 в таблице A, в [Placeholder 2] должны быть слова из Rev 5 (поскольку это последняя версия до Rev 6 для FldID 54 в таблице A).

Так как Rev 8 не имеет записи для FldId 54 в Таблице A, в [Placeholder 3] должны быть слова из Rev 7 (поскольку это последняя версия перед Rev 8 для FldID 54 в Таблице A).

Мне не удалось найти запрос, который может дать мне вышеуказанные результаты. Пожалуйста, помогите.

обновление

Типы данных для полей в ТАБЛИЦЕ B

alt text

Ответы [ 2 ]

1 голос
/ 03 марта 2010

В основном это комбинация максимального группового запроса и обратного пивота. Простой подход заключается в использовании ROW_NUMBER и 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
0 голосов
/ 03 марта 2010
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)

Замените функцию даты функцией, которая извлекает дату и игнорирует время из поля даты и времени. Это даст таблицу, такую ​​как вы хотите, но на 90 градусов больше.

...