如何在 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|
我需要查询一天内进来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|