如何查找每天在Db2中选择的UNION ALL中出现两次以上的值

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

我需要检查一天中出现两次以上的帐号。

下面是我的查询,我得到的结果是,帐号中大于2的帐号仅来自FAILURE,而不是SUCCESS。我需要两者兼得。任何帮助表示赞赏。

样本数据:

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
db2 db2-luw
3个回答
0
投票
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
投票
[状态”(“成功”,“失败”)中的位置

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

cnt_success >=1 and cnt_failure >=1

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

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