使用同一表中的值更新列中的空值,但通过引用另一个表中间接相关的匹配值

问题描述 投票:0回答:1

我需要编写一个Snowflake SQL来根据同一个表中的cid值更新表事务中的空值(cid),但通过引用另一个表付款中的间接相关匹配值(哈希)。

请参阅随附的示例数据和预期结果以获取高级视图。现在还添加了插入查询。我尝试解释以下数据:

  • 假设我在雪花中有两张表——交易和支付。
  • 交易表有列 - tid、cid、revenue1、revenue2。
    • tid 是主键。 cid 可以为空。
  • 支付表有列 - id、tid、hash、amount。
    • id 是主键。
    • tid 始终不为空但不唯一
    • 哈希值可以为空。

规则:

  • 并非交易中的所有 tid 都会出现在付款中。
  • 对于交易表中的某些tid,支付表中可以有一个哈希值。
  • 其他 tid 可以出现在支付表中,但哈希值为空。

示例: 请参阅随附的示例数据和预期结果。 假设交易中有一个 tid 123,cid 为空,但在支付表中有相应的哈希值。 支付表中的相同哈希值也映射到交易 tid 770。现在交易表中的该 tid 770 的 cid 填充为 cid_2。 我们希望利用这种情况,以便将 tid 770 的 cid 值 cid_2 复制到交易表中 tid 123 的 cid 值,因为它们在支付表中具有共同的哈希值。

问题: 我需要为此编写一个雪花查询,以便尽可能在事务表中填充所有此类空 cid。 如果在支付表中找不到相应 tid 的匹配哈希值,某些 cid 可能在交易表中仍保留为空白

样本数据:

交易:

TID 刑事调查局 收入1 收入2
123 1313121 1309075
456 1312312 1309076
789 1311503 1309077
312 1310694 1309078
345 1309885 1309079
678 1309076 1309080
679 1309077 1309081
770 cid_2 309885 1309079
880 cid_1 1309076 1309080
234 1309885 1309079

付款方式:

身份证 TID 哈希 收入
23423 123 3333 56
34534 456 1111 65
23423 789 2222 67
32432 880 1111 87
54754 770 3333 45
98797 312 65
14284 234 3333 54

最终交易表的预期输出:(粗体值是新的,通过支付的哈希引用实现。

TID 刑事调查局 收入1 收入2
123 cid_2 1313121 1309075
456 cid_1 1312312 1309076
789 1311503 1309077
312 1310694 1309078
345 1309885 1309079
678 1309076 1309080
679 1309077 1309081
770 cid_2 1309885 1309079
880 cid_1 1309076 1309080
234 cid_2 1309885 1309079

插入交易和付款查询:

CREATE TABLE transaction (
    TID INT PRIMARY KEY,
    CID VARCHAR(255),  -- Assuming CID is a string, adjust type as needed
    revenue1 INT,
    revenue2 INT
);

INSERT INTO transaction (TID, CID, revenue1, revenue2)
VALUES
(123, NULL, 1313121, 1309075),
(456, NULL, 1312312, 1309076),
(789, NULL, 1311503, 1309077),
(312, NULL, 1310694, 1309078),
(345, NULL, 1309885, 1309079),
(678, NULL, 1309076, 1309080),
(679, NULL, 1309077, 1309081),
(770, 'cid_2', 1309885, 1309079),
(880, 'cid_1', 1309076, 1309080),
(234, NULL, 1309885, 1309079);

------------------------------------------------------------------------------------------
CREATE TABLE payment (
    TPMID INT,
    TID INT,
    cardhash INT,
    Revenue INT,
    PRIMARY KEY (TPMID, TID)  -- Assuming the combination of TPMID and TID is unique
);

INSERT INTO payment (TPMID, TID, cardhash, Revenue)
VALUES
(23423, 123, 3333, 56),
(34534, 456, 1111, 65),
(23423, 789, 2222, 67),
(32432, 880, 1111, 87),
(54754, 770, 3333, 45),
(98797, 312, NULL, 65),
(14284, 234, 3333, 54);
sql snowflake-cloud-data-platform
1个回答
0
投票

我使用 CTE 使其工作,然后根据哈希值进行自连接。这实质上欺骗了每个唯一 TID 的卡散列值。这是一件有趣的事情,希望对您有所帮助。

WITH JOINED AS (SELECT T.TID AS TID
, CID
, REVENUE1
, REVENUE2
, CARDHASH
FROM TRANSACTION T

LEFT JOIN PAYMENT P
ON P.TID = T.TID)
, HARDCASH_DUPES AS (SELECT J.CARDHASH
, J.TID
, R.CID
FROM JOINED J

INNER JOIN JOINED R
ON J.CARDHASH = R.CARDHASH
AND R.CID IS NOT NULL)
SELECT J.TID
, H.CID
, J.REVENUE1
, J.REVENUE2
FROM JOINED J

LEFT JOIN HARDCASH_DUPES H
ON J.TID = H.TID
;
© www.soinside.com 2019 - 2024. All rights reserved.