안녕하세요!
날짜 |
내용 |
1월1일 | 의뢰 |
1월2일 | 의뢰(*완료가안와서재촉) |
1월3일 | 완료1 |
1월4일 | 의뢰 |
1월5일 | 완료2 |
1월6일 | 완료3(완료했지만 굳이다시완료) |
1월7일 | 의뢰 |
위와 같이 '의뢰'를 여러번하고, '완료'도 여러번 일어나는 테이블이 있을때,
(완료옆에 1,2는 설명을 쉽게하고자 제가 임의로 넣은 숫자입니다^^;)
아래와 같은 결과물을 만들고 싶습니다.
결과물
의뢰날짜 | 완료날짜 | ||
1월1일 | 1월3일 | ||
1월4일 | 1월5일 | ||
1월7일 | NULL |
제가 생각한 방법은 테이블을 의뢰테이블 A, 완료테이블 B로 분리하여
의뢰 테이블 A를 기준으로하고,
완료테이블B 을 LEFT 조인하면서
★질문 1번 - JOIN 조건문을 아래와 같이 짜고싶습니다!!!!
1 )의뢰일보다 뒤에 날짜인 완료건들 중에서
2) 그중에서 제일 작은 완료날짜를 조인하자
----------질문 후 답변을 기다리는 동안 ChatGPT 도움받아 아래와 같이 짜봤는데 안돌아가네요 ㅠㅜ 비문인가.... ------------
SELECT A.의뢰,A.의뢰날짜, min(B.완료날짜) from (select 날짜 as 의뢰날짜, 내용 from 테이블 where 내용 = '의뢰' ) A left join (select 날짜 as 완료날짜,내용 from 테이블 where 내용 ='완료' ) B on B.완료날짜 > A.의뢰날짜 group by A.의뢰
--------------------------------------------------------------------------------------------------------------------
조인이 잘 될 경우,
1/1일 의뢰에도 - 1/3일 (완료1)이 붙고
1/2일 의뢰에도 -1/3일 (완료1)이 붙게 될텐데
이때 중복을 '완료값'이 중복인걸 제거하면 될것같거든요.
★ 질문 2-1번
DISTICT나 GROUP BY로 완료날짜가 중복인 것들 중 의뢰날짜가 빠른 것만 남기는 DISTICT, GROUP BY를 할수 있을까요?
★ .2-2번 안된다면.. - ROW_NUBER () OVER (PARTION BY 진행단계완료 ORDER BY 날짜 -- 의뢰날짜겟죠?) 에서 1번만 남기면 될까요?
고수님들 .. 도움 꼭 부탁드립니다 ㅜㅜ
-- 손으로 옮겨적어서 오타가 있을수 있어요 with t as ( select '1월1일' dt , '20' gb , '의뢰' TXT FROM DUAL UNION ALL select '1월2일' dt , '20' gb , '의뢰' TXT FROM DUAL UNION ALL select '1월3일' dt , '30' gb , '완료' TXT FROM DUAL UNION ALL select '1월4일' dt , '20' gb , '의뢰' TXT FROM DUAL UNION ALL select '1월5일' dt , '30' gb , '완료' TXT FROM DUAL UNION ALL select '1월6일' dt , '30' gb , '완료' TXT FROM DUAL UNION ALL select '1월7일' dt , '20' gb , '의뢰' TXT FROM DUAL ) SELECT GB , MIN(CASE WHEN GB1 = '20' THEN DT END ) V1 , MIN(CASE WHEN GB1 = '30' THEN DT END ) V1 FROM ( SELECT SUM(CASE WHEN GB1 < GB2 THEN 1 ELSE 0 END ) OVER(ORDER BY DT ) GB , AA.* FROM ( SELECT GB GB1 , LAG(GB) OVER(ORDER BY DT ) GB2 , A.DT FROM T A ) AA ) AAA GROUP BY GB ORDER BY GB