같은 id 에 특정값이 없는 경우의 추출 쿼리 0 5 1,725

by 엔젤 [SQL Query] [2022.11.08 11:49:59]


안녕하세요. postgresql 에서 막혀 있는 문제가 있어서 질문글을 남깁니다.
아래와 같은 테이블에서 COMPLETED 되지 않은 id 의 건수를 취득하는 쿼리를 작성하려고 하는데요 계속 막혀있는중입니다...

해결 방법에 대해 답변을 부탁드리겠습니다 (- -)(_ _)


--- ---
id |STATUS
1  |RUNNING 
1  |COMPLETED
2  |RUNNING
3  |RUNNING
3  |ERROR
4  |RUNNING
4  |COMPLETED
--- ---
 

by 마농 [2022.11.08 13:32:53]

결과가 어떻게 나오면 되나요?
- 1. 건수만 나오면 되나요?
- 2. id 리스트가 나와야 하나요?


by 우주민 [2022.11.08 13:39:42]
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 해서 구해보았습니다.


by 마농 [2022.11.08 16:12:56]
-- 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
;

 


by 엔젤 [2022.11.08 18:56:09]

우주민님, 마농님 

답변 감사합니다. 건수를 구하는것이었구요 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


by 마농 [2022.11.09 09:04:41]

GROUP BY 기준항목으로 "연월"을 추가하신 듯 하네요.
EXISTS 쿼리에도 "연월" 조건을 추가하셔야 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입