3

当某些数据更改回以前的值时,我在检索卫星表中的最新值时遇到问题。

数据库是雪花。

根据 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添加到哈希差异,每次推送更新时都会创建一条新记录,这也不是预期的结果。

4

1 回答 1

2

正如您(以及标准)所提到的,您需要与最后一个有效记录进行比较。

我不是 Snowflake 的专家,但它可能看起来像这样:

INSERT ALL
  WHEN (SELECT COUNT(*) FROM SAT_ACCOUNT_DETAILS AD WHERE AD.MD5_HUB_ACCOUNT = MD5_Account AND AD.HASH_DIFF = AccHashDiff AND AD.LDTS = (SELECT MAX(LDTS) FROM SAT_ACCOUNT_DETAILS MAD WHERE MAD.MD5_HUB_ACCOUNT = AD.MD5_HUB_ACCOUNT)) = 0
  THEN ....

通过将“AD.LDTS = (SELECT MAX(LDTS) FROM.....”添加到查询中,您可以确保针对最新数据而不是历史数据进行测试

于 2021-04-11T02:33:39.167 回答