我需要检查一天中出现两次以上的帐号。
下面是我的查询,我得到的结果是,帐号中大于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
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|
cnt_success >=1
and cnt_failure >=1
这种问题也可以通过联接来解决。