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

How to find values that appear more than twice per day in a UNION ALL select in Db2

我需要查询一天内进来2次以上的账号

下面是我的查询,我得到的结果是超过 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

取消 UNION 并在 WHERE 中使用 IN 子句会简单得多。

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

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

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

cnt_success >=1
and cnt_failure >=1

这种问题也可以用join来解决。

我不知道你为什么需要 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|