T-SQL для извлечения данных истории из таблицы / log_table с помощью RelevanceDate - PullRequest
3 голосов
/ 19 марта 2012

У меня есть следующие таблицы:

1) TBL (ID, Data, LastUpdated, DateCreated)
2) TBL_LOG(Log_ID, LogCreateDate, ID, Data, LastUpdated, DateCreated)

TBL используется для хранения текущих данных и TBL_LOG используется для хранения всех изменений данных в TBL (с использованием триггера обновления, удаленная запись изTBL скопировано в TBL_LOG).

Теперь мне нужно получить данные по дате актуальности.
Как я могу написать табличную функцию (или другую альтернативу), которая будет возвращать данные в зависимости отRelevanceDate.

Я понимаю логику, но не могу найти хороший способ написать ее на SQL ...
Логика выглядит так:

@RelevanceDate = '2011-03-01'
IF TBL.LastUpdated <= @RelevanceDate THEN return data from TBL
ELSE IF Exists data in TBL_LOG where TBL_LOG.LastUpdated <= @RelevanceDate 
    THEN return most resent data from TBL_LOG where TBL_LOG.LastUpdated <= @RelevanceDate
ELSE IF Exists data in TBL_LOG where TBL_LOG.LastUpdated > @RelevanceDate 
    THEN return the oldest data from TBL_LOG.LastUpdated > @RelevanceDate
ELSE return data from TBL

Этофункция должна возвращать данные, используя приведенную выше логику, для всех записей в TBL.

Короче говоря, для каждой строки в TBL мне нужны данные, которые были на "RelevanceDate".

Ответы [ 2 ]

1 голос
/ 19 марта 2012

В конце моего расследования у меня получилось что-то вроде следующего:

DECLARE @RelevanceDate DATETIME
SET @RelevanceDate = '2012-03-01'

SELECT 
        MainData.ID, MainData.Data, MainData.LastUpdated, MainData.DateCreated
FROM   (
           SELECT 
                  *
                  ,ROW_NUMBER() OVER(PARTITION BY AllData.ID, AllData.RowNum ORDER BY AllData.LastUpdated) AS MainRowNumber
           FROM   (
                      --Current Data
                      SELECT 
                             NULL LogID
                            ,NULL LogCreateDate
                            ,*
                            ,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY LastUpdated DESC) AS RowNum
                      FROM   TBL
                      WHERE  (lastupdate<=@RelevanceDate)

                      UNION

                      --History Data
                      SELECT  
                            *
                            ,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY LastUpdated) AS RowNum
                      FROM   TBL_LOG
                      WHERE  lastupdate>@RelevanceDate
                  ) AllData WHERE AllData.RowNum=1
       ) MainData
WHERE  MainData.MainRowNumber = 1

Если у кого-то есть предложение, как это можно сделать лучше, я буду рад его видеть:)

0 голосов
/ 19 марта 2012

Вы можете использовать операторы NESTED CASE в своем выборе, примерно так:

SELECT
    CASE WHEN TBL.LastUpdated <= @RelevanceDate  THEN TBL.data ELSE
        CASE WHEN TBL_LOG.LastUpdated < @RelevanceDate AND NOT TBL_LOG.Data IS NULL THEN 
             TBL_LOG.Data
        ELSE
             ...
        END
    END AS Data
FROM TBL TBL
LEFT JOIN TBL_LOG TBL_LOG
ON TBL.ID = TBL_LOG.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...