Проверка таблицы медленно изменяющихся размеров типа 2 - PullRequest
2 голосов
/ 08 мая 2019

Мне нужно проверить таблицу медленно изменяющихся размеров ТИПА 2, у нас возникла проблема, когда новые записи вставляются в таблицу, но старые записи не устарели.Это было исправлено.Однако мне нужно написать сценарий SQL для проверки функциональности столбца EXP.Должен ли я использовать CROSS APPLY и проверять каждый столбец или есть лучший способ сделать это?

Я пробовал перекрестное применение, но не уверен, как отличить новую запись от старой.

Если есть измененияв записи данных, например, для loan_no = 12345 с текущей максимальной датой exp '9999-12-31', эта запись будет вставлять дату в столбец EXP, и будет вставлена ​​новая запись, а дата EXP для новой записи будет иметь дату '9999-12-31' .Я должен убедиться, что это происходит для любых изменений и для тех записей, где не обнаружено никаких изменений, старая запись останется с датой EXP '9999-12-31'

1 Ответ

2 голосов
/ 08 мая 2019

Как правило, вы можете использовать функцию LAG для проверки изменяющихся дат SCD.Пример (любые записи в наборе результатов представляют ошибки):

DECLARE @x table
(
    loan_no int NOT NULL
    , start date NOT NULL
    , [exp] date NOT NULL
)

INSERT INTO @x
VALUES
(12345, '2019-01-01', '2019-01-31')
, (12345, '2019-02-01', '2019-02-28')
, (12345, '2019-03-01', '9999-12-31')
, (12345, '2019-04-01', '9999-12-31')

SELECT *
FROM
    (
        SELECT
            loan_no
            , start
            , [exp]
            , LAG([exp], 1, DATEADD(DAY, -1, start)) OVER (PARTITION BY loan_no ORDER BY start) last_exp
        FROM @x
    ) Q
WHERE last_exp <> DATEADD(DAY, -1, start)

Для другого сценария, чтобы убедиться, что у вас всегда есть exp дата '9999-12-31', вы можете использоватьпростой MAX запрос:

SELECT loan_no
FROM @x
GROUP BY loan_no
HAVING MAX([exp]) <> '9999-12-31'

Вы также можете иметь их в одном запросе как что-то вроде:

SELECT *
FROM
    (
        SELECT
            loan_no
            , start
            , [exp]
            , LAG([exp], 1, DATEADD(DAY, -1, start)) OVER (PARTITION BY loan_no ORDER BY start) last_exp
            , ROW_NUMBER() OVER (PARTITION BY loan_no ORDER BY start DESC) inverse
        FROM @x
    ) Q
WHERE
    last_exp <> DATEADD(DAY, -1, start)
    OR inverse = 1 AND [exp] <> '9999-12-31'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...