我需要编写一个Snowflake SQL来根据同一个表中的cid值更新表事务中的空值(cid),但通过引用另一个表付款中的间接相关匹配值(哈希)。
请参阅随附的示例数据和预期结果以获取高级视图。现在还添加了插入查询。我尝试解释以下数据:
规则:
示例: 请参阅随附的示例数据和预期结果。 假设交易中有一个 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);
我使用 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
;