-
<TIL> 2023-12-28내일배움캠프(데이터 분석 부트캠프 1기)/TIL & WIL 2023. 12. 28. 21:48
내일배움캠프 본 캠프 8일차 TIL 작성
- 오늘 학습한 것
- SQLD 자격증 대비반 강의 3주차 강의 수강
- SQL 코드카타
다소 어려운 SQL 문제를 풀다보니 하루에 많은 문제를 풀기는 쉽지 않지만 한 문제 문제 마다 배울 점들 새롭게 알게되는 것들을 발견하고 있다.
어제 WITH문과 WITH RECURSIVE문을 알게 되었고 그래서 오늘 해당 부분을 활용하여 코딩테스트를 풀었다.
서브쿼리로 하면 다소 문장이 복잡해보이던 것들이 WITH문을 이용하니 조금 더 간결하게 문제를 풀 수는 있었다.
문제 링크 : https://leetcode.com/problems/average-time-of-process-per-machine/
문제에서 주어진 테이블은 위와 같았고, 문제의 요구사항은 머신의 동작 시간의 평균을 구하는 것이었다.
나는 이를 해결하기 위해서 WITH문 2개를 연속으로 작성하였다.
ACTIVITY_TYPE이 START인 임시테이블 START_TIME과 END인 테이블 END_TIME을 만들어서
두 테이블을 조인하고 MACHINE_ID를 기준으로 GROUP BY하여
해당 머신의 완료시간에 시작시간을 빼준 값의 평균을 구했다.
코드는 아래와 같다.
WITH START_TIME(MACHINE_ID, PROCESS_ID, ACTIVITY_TYPE, TIMESTAMP) AS ( SELECT MACHINE_ID, PROCESS_ID, ACTIVITY_TYPE, TIMESTAMP FROM ACTIVITY WHERE ACTIVITY_TYPE = 'START' ), END_TIME(MACHINE_ID, PROCESS_ID, ACTIVITY_TYPE, TIMESTAMP) AS ( SELECT MACHINE_ID, PROCESS_ID, ACTIVITY_TYPE, TIMESTAMP FROM ACTIVITY WHERE ACTIVITY_TYPE = 'END' ) SELECT S.MACHINE_ID, ROUND(AVG(E.TIMESTAMP - S.TIMESTAMP), 3) AS PROCESSING_TIME FROM START_TIME S INNER JOIN END_TIME E ON (S.MACHINE_ID, S.PROCESS_ID) = (E.MACHINE_ID, E.PROCESS_ID) GROUP BY S.MACHINE_ID
임시 테이블을 2개 생성해 조인하고 조회하고 하는 과정이 뭔가 복잡하게 돌아가는 것 같다는 생각이 들어서
더 나은 코드를 작성한 사람의 코드를 참고해보기로 했다.
SELECT A.MACHINE_ID, ROUND(AVG(B.TIMESTAMP - A.TIMESTAMP), 3) AS PROCESSING_TIME FROM ACTIVITY A, ACTIVITY B WHERE A.MACHINE_ID = B.MACHINE_ID AND A.PROCESS_ID = B.PROCESS_ID AND A.ACTIVITY_TYPE = 'start' AND B.ACTIVITY_TYPE = 'end' GROUP BY A.MACHINE_ID;
위 코드는 동일한 테이블 2개를 동시에 조회하고 WHERE 조건으로 MACHINE_ID와 PROCESS_ID가 같은,
ACTIVITY_TYPE이 한쪽은 START, 한쪽은 END인 조건을 수행함으로써
손쉽게 머신의 평균 동작 시간을 계산하고 있다.
굳이 새롭게 임시 테이블을 2개 생성할 필요 없이 FROM절로 두 번 같은 테이블을 가져와서 조건으로 문제를 해결했다는 것 자체가 기존에 생각하지 못했던 방식이라 조금 신선했다. 다음에 비슷한 문제를 만나게되면 이런 방식으로도 코드를 짜봐야겠다.
일반적으로 프로그래밍 언어의 경우 코드가 짧다고 해서 실행속도가 빠르고 항상 좋은 것은 아니지만
SQL에서는 코드가 복잡하면 그것만으로도 이해가 좀 어려워져서 깔끔하고 간결한 코드를 작성하는 것도 좋은 아이디어 같다.
얻었던 인사이트와는 별개로 위 코드는 처음에 작성했던 WITH문을 이용한 코드와 비슷한 실행속도를 보였다.
하지만 데이터가 방대했다면 어떻게 됐을진 모르겠다. 아마도 조인을 하는 과정이 빠지기 때문에 후자가 그래도 좀 더 빠르게 실행되지 않을까 싶다.
'내일배움캠프(데이터 분석 부트캠프 1기) > TIL & WIL' 카테고리의 다른 글
<WIL> 2023년 12월 4주차 회고 (1) 2023.12.29 <TIL> 2023-12-29 (1) 2023.12.29 <TIL> 2023-12-27 (1) 2023.12.27 <TIL> 2023-12-26 (1) 2023.12.26 <WIL> 2023년 12월 3주차 회고 (0) 2023.12.22 - 오늘 학습한 것