Как исключить определенные значения в запросе - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь получить сумму транзакций за последние 30 дней. Но я также должен быть уверен, что на учетных записях также нет комментариев #KYC:

Я в Снежинке и пробовал запускать различные подзапросы и объединения. Я официально застрял.


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
  ;

Итак, я думаю, что ближе, *? 1015 *

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

Этот подзапрос:

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'
           )

не связан с внешним запросом. Следовательно, он возвращает 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'
           )
0 голосов
/ 13 октября 2019

Принимая во внимание точку Гордона, что НЕ СУЩЕСТВУЕТ необходимость учитывать, и иногда снежинка ведет себя странно из коррелированных подзапросов.

Будет ли переключение на CTE и проверка на неудачное левое соединение через IS NULLпомощь?

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;
...