DB2中的UNION ALL,从2个选择查询中检查计数大于2

问题描述 投票:0回答:2

需要下面的帮助,我需要检查一天中两次以上进入的帐号。下面是我的查询,我得到的结果是来自FAILURE的两次以上的帐号并非来自成功。我需要两者兼得。任何帮助表示赞赏。

样本数据:

04/28/2020 123345 BERLIN 5645756768 SUCCESS
04/28/2020 123346 BERLIN 5645756768 FAILURE
04/28/2020 123344 BERLIN 5645756762 SUCCESS
04/28/2020 123345 BERLIN 5645756763 FAILURE
04/28/2020 123346 BERLIN 5645756764 SUCCESS
04/28/2020 123347 BERLIN 5645756766 FAILURE

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
db2 db2-luw
2个回答
0
投票

消除UNION并仅在WHERE中使用IN子句会容易得多。

[状态”(“成功”,“失败”)中的位置


0
投票

一个简单的解决方法-针对您所描述的Moe复杂查询-可能是分隔cnt列。在第一部分中使用cnt_success,在第一部分中使用0作为cnt_failure,在第二部分中使用cercer。

因此您可以在主/外部查询中过滤到

cnt_success >=1
and cnt_failure >=1

这种问题也可以通过联接来解决。

© www.soinside.com 2019 - 2024. All rights reserved.