Как найти значения, которые появляются более двух раз в день, в UNION ALL select в Db2 - PullRequest
0 голосов
/ 28 апреля 2020

Мне нужно проверить номер счета, который приходил более 2 раз за один день.

Ниже приведен мой запрос, я получаю результаты, в которых номер счета, который пришел более чем 2, только из ОТКАЗ не от УСПЕХА. Мне нужно получить от обоих. Любая помощь приветствуется.

Пример данных:

04/28/2020 123345 BERLIN 5645756768 SUCCESS
04/28/2020 123346 BERLIN 5645756768 FAILURE
04/28/2020 123344 BERLIN 5645756768 SUCCESS
04/28/2020 123344 BERLIN 5645756761 FAULTED
04/28/2020 123345 BERLIN 5645756763 FAILURE
04/28/2020 123346 BERLIN 5645756764 SUCCESS
04/28/2020 123347 BERLIN 5645756766 FAILURE
04/28/2020 123344 BERLIN 5645756763 TIME OUT
04/28/2020 123344 BERLIN 5645756760 PENDING

Query:

SELECT
    DATE,
    ID,
    NAME,
    ACCOUNT,
    STATUS
FROM
(
SELECT
    T1.DATE AS DATE, 
    T1.ID AS ID,
    T1.NAME AS NAME,
    T2.ACCOUNT_NUMBER AS ACCOUNT,
    T2.STATUS AS STATUS,
    COUNT(1) OVER (PARTITION BY T2.ACCOUNT_NUMBER, DATE(DATE) CNT
FROM TABLE1 AS T1
JOIN TABLE2 AS T2
ON T2.ID = T1.ID 
WHERE STATUS = 'SUCCESS'
GROUP BY T1.ID, T1.NAME,T2.ACCOUNT_NUMBER,T2.STATUS

UNION ALL

SELECT
    T1.DATE AS DATE,
    T1.ID AS ID,
    T1.NAME AS NAME,
    T2.ACCOUNT_NUMBER AS ACCOUNT,
    T2.STATUS AS STATUS,
    COUNT(1) OVER (PARTITION BY T2.ACCOUNT_NUMBER, DATE(DATE) CNT
FROM TABLE1 AS T1
JOIN TABLE2 AS T2
ON T2.ID = T1.ID 
WHERE STATUS = 'FAILED'
GROUP BY T1.ID, T1.NAME,T2.ACCOUNT_NUMBER,T2.STATUS
)
WHERE CNT > 2;'

Ожидаемый результат:

04/28/2020 123345 BERLIN 5645756768 SUCCESS
04/28/2020 123346 BERLIN 5645756768 FAILURE
04/28/2020 123344 BERLIN 5645756768 SUCCESS

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Простое исправление - для вашего сложного запроса, который вы описали, - это разделение столбцов cnt. используйте cnt_success в первом с 0 в качестве cnt_failure в первой части и вице-cersa во второй.

Таким образом, вы можете фильтровать в основном / внешнем запросе

cnt_success >=1
and cnt_failure >=1

Этот вид проблемы также могут быть решены с помощью объединения.

0 голосов
/ 28 апреля 2020

Я понятия не имею, зачем вам нужно UNION ALL здесь, но давайте предположим, что у вас есть более сложные проверки с вашим реальным делом.

WITH TAB (DATE, ID, NAME, ACCOUNT, STATUS) AS 
(
VALUES
  ('04/28/2020', 123345, 'BERLIN', '5645756768', 'SUCCESS')
, ('04/28/2020', 123346, 'BERLIN', '5645756768', 'FAILURE')
, ('04/28/2020', 123344, 'BERLIN', '5645756768', 'SUCCESS')
, ('04/28/2020', 123344, 'BERLIN', '5645756761', 'FAULTED')
, ('04/28/2020', 123345, 'BERLIN', '5645756763', 'FAILURE')
, ('04/28/2020', 123346, 'BERLIN', '5645756764', 'SUCCESS')
, ('04/28/2020', 123347, 'BERLIN', '5645756766', 'FAILURE')
, ('04/28/2020', 123344, 'BERLIN', '5645756763', 'TIME OUT')
, ('04/28/2020', 123344, 'BERLIN', '5645756760', 'PENDING')
)
SELECT DATE, ID, NAME, ACCOUNT, STATUS
FROM
(
SELECT 
  DATE, ID, NAME, ACCOUNT, STATUS
, COUNT(1) OVER (PARTITION BY DATE, ACCOUNT) CNT
--FROM TAB
--WHERE STATUS IN ('SUCCESS', 'FAILURE')
FROM
(
SELECT DATE, ID, NAME, ACCOUNT, STATUS
FROM TAB
WHERE STATUS = 'SUCCESS'
  UNION ALL
SELECT DATE, ID, NAME, ACCOUNT, STATUS
FROM TAB
WHERE STATUS = 'FAILURE'
)
) 
WHERE CNT>2;

Тот же самый результат, который вы получите, если вы просто прокомментируете в целом FROM (...) и раскомментируйте закомментированные строки. Результат это:

|DATE      |ID         |NAME  |ACCOUNT   |STATUS |
|----------|-----------|------|----------|-------|
|04/28/2020|123345     |BERLIN|5645756768|SUCCESS|
|04/28/2020|123344     |BERLIN|5645756768|SUCCESS|
|04/28/2020|123346     |BERLIN|5645756768|FAILURE|
0 голосов
/ 28 апреля 2020

Было бы намного проще исключить UNION и просто использовать предложение IN в вашем WHERE.

WHERE STATUS in ('SUCCESS', 'FAILED')

...