当某些数据更改回以前的值时,我在检索卫星表中的最新值时遇到问题。
数据库是雪花。
根据 Data Vault 2.0,我目前正在使用 hash diff 函数来评估是否在卫星表中插入新记录,如下所示:
INSERT ALL
WHEN (SELECT COUNT(*) FROM SAT_ACCOUNT_DETAILS AD WHERE AD.MD5_HUB_ACCOUNT = MD5_Account AND AD.HASH_DIFF = AccHashDiff) = 0
THEN
INTO SAT_ACCOUNT_DETAILS (MD5_HUB_ACCOUNT
, HASH_DIFF
, ACCOUNT_CODE
, DESCRIPTION
, SOME_DETAIL
, LDTS)
VALUES (MD5_AE_Account
, AccHashDiff
, AccountCode
, Description
, SomeDetail
, LoadDTS)
SELECT DISTINCT
MD5(AccountId) As MD5_Account
, MD5(UPPER(COALESCE(TO_VARCHAR(AccountCode), '')
|| '^' || COALESCE(TO_VARCHAR(Description), '')
|| '^' || COALESCE(TO_VARCHAR(SomeDetail), '')
)) AS AccHashDiff
, AccountCode
, Description
, SomeDetail
, LoadDTS
FROM source_table;
第一次,添加了AccountCode = '100000' 和SomeDetail = 'ABC' 的新记录:
MD5_HUB_ACCOUNT | HASH_DIFF | ACCOUNT_CODE | 描述 | 一些细节 | LDTS |
---|---|---|---|---|---|
c81e72... | 8d9d43... | 100000 | 一个帐户 | 美国广播公司 | 2021-04-08 10:00 |
一小时后,更新将SomeDetail的值更改为“DEF”,这是生成的表:
MD5_HUB_ACCOUNT | HASH_DIFF | ACCOUNT_CODE | 描述 | 一些细节 | LDTS |
---|---|---|---|---|---|
c81e72... | 8d9d43... | 100000 | 一个帐户 | 美国广播公司 | 2021-04-08 10:00 |
c81e72... | a458b2... | 100000 | 一个帐户 | 国防军 | 2021-04-08 11:00 |
第三次更新将SomeDetail的值设置回“ABC”,但该记录并未插入卫星表中,因为散列差异的值与第一个插入的记录相同(即 8d9d43...)。
如果我查询卫星表中的最新记录,LDTS 列会告诉我它是带有“DEF”的记录,这不是所需的结果。相反,我应该有SomeDetail = 'ABC' 和LDTS = '2021-04-08 12:00' 的记录。
对此的正确方法是什么?如果我将LoadDTS添加到哈希差异,每次推送更新时都会创建一条新记录,这也不是预期的结果。