验证2型缓慢变化尺寸表

时间:2019-05-08 11:52:26

标签: sql sql-server

我必须验证TYPE 2 Slowly Changeing Dimensions表,我们遇到了将新记录插入表但旧记录未过期的问题。已经纠正。但是,我需要编写SQL脚本来验证EXP列的功能。我应该使用CROSS APPLY并验证每一列,还是有更好的方法呢?

我尝试交叉套用,但不确定如何区分新记录和旧记录。

如果数据记录发生变化(例如,loan_no = 12345,且当前exp的最大日期为'9999-12-31'),则该记录将在EXP列下插入日期,并且将插入新记录,而新记录的EXP日期将被插入日期为“ 9999-12-31”。我必须确保所有更改都发生这种情况,并且对于那些未检测到更改的记录,旧记录将保留为EXP日期为'9999-12-31'

1 个答案:

答案 0 :(得分:2)

一般而言,您可以使用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'