erDiagram
MACHINE_ACTIVITY {
int machine_id
int process_id
enum activity_type
float timestamp
}
머신 별 가동 시간의 평균
문제 풀이
MySQL 1
WITH START AS (
SELECT *, SUM(TIMESTAMP) AS SS, COUNT(*) AS SCNT
FROM ACTIVITY
WHERE ACTIVITY_TYPE = 'START'
GROUP BY MACHINE_ID, ACTIVITY_TYPE
),
END AS (
SELECT *, SUM(TIMESTAMP) AS ES, COUNT(*) AS ECNT
FROM ACTIVITY
WHERE ACTIVITY_TYPE = 'END'
GROUP BY MACHINE_ID, ACTIVITY_TYPE
)
SELECT S.MACHINE_ID, ROUND((ES-SS)/SCNT,3) AS PROCESSING_TIME
FROM START S
JOIN END E ON S.MACHINE_ID = E.MACHINE_ID
좀 이상하게 짠거 같지만...
시작 시간, 종료 시간 별로 TABLE을 나눈 후, GROUP BY로 시간 합을 구한다.
JOIN 후, (끝난 시간 합 - 시작 시간)/그룹 별 개수에 반올림해주면 된다.
MySQL 2
SELECT
MACHINE_ID,
ROUND(2*SUM(IF(ACTIVITY_TYPE='END',TIMESTAMP,-TIMESTAMP))/COUNT(*),3) AS PROCESSING_TIME
FROM ACTIVITY
GROUP BY MACHINE_ID
SUM IF로 바로 계산된 컬럼 하나 생성해주고, COUNT/2로 나눠주기 (START,END) 한 쌍이라 개수 2배임
댓글