코드설명
INNER JOIN + SCALAR SUBQUERY 활용합니다.
문제의 접근방법입니다.
1. 평균 레코드를 구하기 위해 각 MACHINE_ID와 PROCESS_ID 별로 시간차이를 구합니다.
그렇게 되면,
MACHINE_ID | DIFF_TIMESTAMP 와 같이 구해집니다.
그리고 그 MACHINE_ID 의 평균을 구하기 위해 다시 GROUP BY 를 해주면, 평균 차이값을 구할 수 있습니다.
SCALAR SUBQUERY를 활용할경우에는 부분범위처리를 사용가능합니다.
만약 MACHINE_ID 1개당 존재하는 PROCESS_ID 레코드가 매우 많을경우 비효율적입니다. 하지만 부분범위처리 내에서는 이 방식이 더 효율적일 것 입니다.
세번째는, (MACHINE_ID 별 종료평균시간) - (MACHINE_ID 별 시작평균시간) 을 빼면, 각 기계당 평균시간을 구할 수 있습니다.
MYSQL 코드
JOIN을 활용한 코드1입니다.
SELECT SUB1.MID AS machine_id, ROUND(AVG(SUB1.TIMESTAMP),3) AS processing_time
FROM (SELECT A1.MACHINE_ID AS 'MID'
,(A2.TIMESTAMP - A1.TIMESTAMP) AS 'TIMESTAMP'
FROM ACTIVITY A1, ACTIVITY A2
WHERE A2.MACHINE_ID = A1.MACHINE_ID
AND A1.PROCESS_ID = A2.PROCESS_ID
AND A1.ACTIVITY_TYPE = 'start'
AND A2.ACTIVITY_TYPE = 'end') SUB1
GROUP BY SUB1.MID
SCALAR SUBQUERY를 사용한 코드2입니다.
SELECT SUB1.MACHINE_ID AS machine_id, ROUND(AVG(SUB1.TIMESTAMP), 3) AS processing_time
FROM (SELECT A1.MACHINE_ID,
(SELECT TIMESTAMP
FROM ACTIVITY A2
WHERE A2.MACHINE_ID = A1.MACHINE_ID
AND A2.PROCESS_ID = A1.PROCESS_ID
AND A2.ACTIVITY_TYPE = 'end') - A1.TIMESTAMP AS TIMESTAMP
FROM ACTIVITY A1
WHERE A1.ACTIVITY_TYPE = 'start') AS SUB1
GROUP BY SUB1.MACHINE_ID
평균 구하는 방법을 활용한 코드입니다.
SELECT A1.MACHINE_ID 'machine_id',
ROUND((SELECT AVG(TIMESTAMP)
FROM ACTIVITY A2
WHERE A2.ACTIVITY_TYPE = 'end'
AND A2.MACHINE_ID = A1.MACHINE_ID)
- (SELECT AVG(TIMESTAMP)
FROM ACTIVITY A2
WHERE A2.ACTIVITY_TYPE = 'START'
AND A2.MACHINE_ID = A1.MACHINE_ID), 3) AS 'processing_time'
FROM ACTIVITY A1
GROUP BY A1.MACHINE_ID;