如何在查询中消除某些值

时间:2019-10-11 22:26:16

标签: mysql sql snowflake-data-warehouse

我正在尝试获取过去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
  ;

那么,我想是吗?

2 个答案:

答案 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;