我必须验证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'
答案 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'