없는 상태 = 성공한 모든 레코드 찾기

질문:

백엔드에서 실행 중인 프로세스가 있는데 데이터베이스에 상태를 기록하고 있습니다.현재, 나는 지난달 이후 성공적으로 실행되지 않은 모든 프로세스를 찾아야 한다.
샘플 테이블:
PID        executiondate  Status
1          2021-06-15     FAILED.       <- PID 1 was successful, but in last month 
1          2021-06-05     FAILED
1          2021-06-01     FAILED
1          2021-05-01     SUCCESSFUL  
2          2021-06-15     SUCCESSFUL    <- PID 2 was successful failed within month
2          2021-06-05     FAILED
2          2021-06-01     SUCCESSFUL
3          2021-06-15     FAILED        <- PID 3 only fails
3          2021-06-05     FAILED
3          2021-06-01     FAILED
4          2021-06-15     SUCCESSFUL    <- PID 4 only successful
4          2021-06-05     SUCCESSFUL
4          2021-06-01     SUCCESSFUL
조건:
  • 2021년 6월 16일 조회 중
  • 지난달(2021년 6월 16일∼2021년 5월 16일) 실패한 PID만 검색
  • 예상 결과:
  • PID 1 및 PID 3
  • 내 시도:
  • 각 PID의 상태 수를 가져오려고 시도했는데 1개의 수와 실패 상태가 기록되어 있습니다.하지만 효과가 없었다.
     WITH dataset_by_status AS
     (
              SELECT   pid,
                   Count(*) AS counter,
                   status
              FROM     exampletable
              WHERE    (
                            status = 'FAILED'
                   OR       status = 'SUCCESSFUL')
              AND      executiondate >= (Now() - interval '1 MONTH')
              GROUP BY status
              ORDER BY pid )
     SELECT   pid,
              count(*) AS counter
     FROM     dataset_by_status
     WHERE    status = 'FAILED'
     GROUP BY pid
     HAVING   count(*) = 1
    
  • 답안

    지난 ~30일 동안 "성공"이 없었던 모든 PID가 필요합니다.그것들을 찾으려면 PID에 따라 집합하고 이런 줄을 찾을 수 없는지 확인하십시오.
    select pid
    from exampletable
    group by pid
    having count(*) filter (where status = 'SUCCESSFUL'
                              and executiondate >= now() - interval '1 month') = 0;
    
    날짜 범위의 장애에 카운터를 추가하는 경우:
    select pid, count(*) filter (where status = 'FAILED'
                                 and executiondate >= now() - interval '1 month') as failed
    
    다른 한편, 지난 ~30일 동안 항목이 있는 PID로 제한하려면 날짜 범위 조건을 WHERE로 이동합니다.
    select pid, count(*) filter (where status = 'FAILED') as failed
    from exampletable
    where executiondate >= now() - interval '1 month'
    group by pid
    having count(*) filter (where status = 'SUCCESSFUL') = 0;