안녕하세요. postgresql 에서 막혀 있는 문제가 있어서 질문글을 남깁니다.
아래와 같은 테이블에서 COMPLETED 되지 않은 id 의 건수를 취득하는 쿼리를 작성하려고 하는데요 계속 막혀있는중입니다...
해결 방법에 대해 답변을 부탁드리겠습니다 (- -)(_ _)
--- ---
id |STATUS
1 |RUNNING
1 |COMPLETED
2 |RUNNING
3 |RUNNING
3 |ERROR
4 |RUNNING
4 |COMPLETED
--- ---
결과가 어떻게 나오면 되나요?
- 1. 건수만 나오면 되나요?
- 2. id 리스트가 나와야 하나요?
WITH TAB AS ( SELECT '1' AS ID, 'RUNNING' AS STATUS UNION ALL SELECT '1' , 'COMPLETED' UNION ALL SELECT '2' , 'RUNNING' UNION ALL SELECT '3' , 'RUNNING' UNION ALL SELECT '3' , 'ERROR' UNION ALL SELECT '4' , 'RUNNING' UNION ALL SELECT '4' , 'COMPLETED' ) SELECT COUNT(DISTINCT ID) FROM TAB A WHERE NOT EXISTS ( SELECT ID FROM TAB B WHERE STATUS = 'COMPLETED' AND A.ID = B.ID )
COMPLETED 가 찍힌 ID 를 제외한 데이터를 구하고, 구한 데이터 들 중에 ID의 DISTINCT 값을 COUNT 해서 구해보았습니다.
-- 1. 건수 구하기 --
SELECT COUNT(DISTINCT id)
- COUNT(CASE status WHEN 'COMPLETED' THEN id END) cnt
FROM t
;
-- 2. ID 목록 구하기 --
SELECT id
FROM t
GROUP BY id
HAVING COUNT(CASE status WHEN 'COMPLETED' THEN 1 END) = 0
;
우주민님, 마농님
답변 감사합니다. 건수를 구하는것이었구요 id목록 구하는 쿼리까지 답변 주셔서 감사합니다.
답변주신 쿼리 확인해보고 문제 없는것을 확인했습니다. 감사합니다^^/
--- 테스트 데이터 --- "id" "status" 1 "running" 1 "completed" 2 "running" 3 "running" 4 "running" 4 "error" 5 "running" 5 "completed" 6 "running" 6 "error"
------------
select count(distinct id) from cnt_test_tbl a where not exists ( select id from cnt_test_tbl b where status = 'completed' and a.id = b.id )
결과 : 4건
-----------
select id from cnt_test_tbl group by id having count(case status when 'completed' then 1 end) = 0
결과 :
"id"
2
3
4
6
GROUP BY 기준항목으로 "연월"을 추가하신 듯 하네요.
EXISTS 쿼리에도 "연월" 조건을 추가하셔야 합니다.