我正在尝试获取过去30天内的交易总额。但是,我还需要确保帐户上也没有#KYC:Pass评论。
我在Snowflake中,我尝试过运行各种子查询和联接。我正式被困住了。
SELECT SUM(amount_base_unit) as GPV, p.unit_token FROM PAYMENTS_DW.PUBLIC.PAYMENT_TRANSACTIONS as p
WHERE country_code='US'
AND NOT EXISTS (
SELECT c.target_token FROM REGULATOR.RAW_OLTP.COMMENTS as c
WHERE c.text ILIKE '%#KYC:Pass%'
and c.updated_at < '2019-10-11'
)
AND is_GPV='1'
AND PAYMENT_TRX_RECOGNIZED_AT BETWEEN dateadd(month,-3,current_timestamp()) AND dateadd(month,0,current_timestamp())
GROUP BY unit_token
HAVING SUM(amount_base_unit) >= 10000000
LIMIT 5
;
它不返回任何行(我知道这是不正确的)。大家有什么想法吗?
编辑/更新:
我切换了查询以查看出了什么问题,并且看起来子查询是罪魁祸首。 NOT ILIKE KYC:Pass过滤器将一直起作用,直到我抛出聚合子查询来总结交易为止。
FROM REGULATOR.RAW_OLTP.CASES c
JOIN REGULATOR.RAW_OLTP.AUDIT_LOGS ral
ON ral.case_id = c.id
WHERE ral.comment not ilike '%#KYC:Pass%'
AND EXISTS (SELECT SUM(p.amount_base_unit) FROM PAYMENTS_DW.PUBLIC.PAYMENT_TRANSACTIONS as p
WHERE p.country_code ='US'
AND p.is_GPV='1'
AND p.PAYMENT_TRX_RECOGNIZED_AT BETWEEN dateadd(month,-1,current_timestamp()) AND dateadd(month,0,current_timestamp())
GROUP BY p.unit_token
HAVING SUM(p.amount_base_unit) >= 10000000)
LIMIT 5
;
那么,我想是吗?
答案 0 :(得分:2)
此子查询:
NOT EXISTS (SELECT c.target_token
FROM REGULATOR.RAW_OLTP.COMMENTS as c
WHERE c.text ILIKE '%#KYC:Pass%' AND
c.updated_at < '2019-10-11'
)
与外部查询不相关。因此,对于 all 行,它返回true或false。我推测您想要一个相关子句。我不知道是什么,但是也许:
NOT EXISTS (SELECT 1
FROM REGULATOR.RAW_OLTP.COMMENTS c
WHERE c.target_token = p.unit_token AND
c.text ILIKE '%#KYC:Pass%' AND
c.updated_at < '2019-10-11'
)
答案 1 :(得分:0)
考虑到戈登的观点,即“不存在”需要被关联,雪花有时表现出对相关子查询的奇怪印象。
是否要切换到CTE并通过IS NULL帮助检查失败的LEFT JOIN?
WITH kyc_pass_com AS (
SELECT DISTINCT target_token
FROM REGULATOR.RAW_OLTP.COMMENTS
WHERE text ILIKE '%#KYC:Pass%'
AND updated_at < '2019-10-11'
)
SELECT SUM(amount_base_unit) as GPV
,p.unit_token
FROM PAYMENTS_DW.PUBLIC.PAYMENT_TRANSACTIONS AS p
LEFT JOIN kyc_pass_com AS c
ON c.target_token = p.unit_token
WHERE p.country_code='US'
AND c.target_token IS NULL
AND is_GPV='1'
AND PAYMENT_TRX_RECOGNIZED_AT BETWEEN dateadd(month,-3,current_timestamp()) AND current_timestamp()
GROUP BY unit_token
HAVING SUM(amount_base_unit) >= 10000000
LIMIT 5;