qcc 7회차
3번문제_2번째 정답
# 3번 정답2 둘다정답
with running_time as (
select *
,lead(status_time) OVER (PARTITION BY server_id ORDER BY status_time) AS next_status_time
,lead(session_status) OVER (PARTITION BY server_id ORDER BY status_time) AS next_session_status
from server_utilization
), server_uptime_second as (
SELECT server_id
,floor( sum(TIMESTAMPDIFF(SECOND, status_time, next_status_time)) / 86400) uptime_days
from running_time
where session_status = 'start'
and next_session_status = 'stop'
group by 1
)
select sum(uptime_days)
from server_uptime_second;
이 SQL 쿼리는 서버 가동 시간(일 단위)을 각 서버별로 계산한 뒤, 모든 서버의 총 가동 시간을 합산하여 반환합니다. 쿼리를 단계별로 살펴보겠습니다.
1. WITH running_time CTE
with running_time as (
select *,
lead(status_time) OVER (PARTITION BY server_id ORDER BY status_time) AS next_status_time,
lead(session_status) OVER (PARTITION BY server_id ORDER BY status_time) AS next_session_status
from server_utilization
)
• 기능:
• 각 server_id별로, LEAD 함수로 다음 값을 가져옴:
• next_status_time: 현재 행의 status_time 이후의 시간.
• next_session_status: 현재 행의 session_status 이후의 상태.
• PARTITION BY server_id:
• 각 서버(server_id)를 독립적으로 계산.
• ORDER BY status_time:
• status_time 기준으로 정렬하여 시간 순서를 보장.
2. server_uptime_second CTE
server_uptime_second as (
SELECT server_id,
floor(sum(TIMESTAMPDIFF(SECOND, status_time, next_status_time)) / 86400) uptime_days
FROM running_time
WHERE session_status = 'start'
AND next_session_status = 'stop'
GROUP BY 1
)
• 기능:
• 조건: session_status = 'start'이고, next_session_status = 'stop'인 경우만 포함.
• 이는 서버가 시작(start)된 상태에서 중단(stop)되기까지의 기간을 나타냄.
• 가동 시간 계산:
• TIMESTAMPDIFF(SECOND, status_time, next_status_time):
• 각 구간의 가동 시간을 초 단위로 계산.
• SUM(...) / 86400:
• 서버 가동 시간의 총합을 초 단위에서 일 단위로 변환.
• FLOOR(...):
• 결과를 내림하여 정수 값으로 만듦.
• GROUP BY server_id:
• 각 서버(server_id)별로 가동 시간을 계산.
3. 최종 SELECT
select sum(uptime_days)
from server_uptime_second;
• 기능:
• 각 서버(server_id)별로 계산된 가동 시간(uptime_days)을 모두 합산.
• 결과는 **모든 서버의 총 가동 시간(일 단위)**입니다.
출력 결과
• 최종 열:
• sum(uptime_days): 모든 서버의 총 가동 시간(일 단위).
활용 예시
• 데이터 센터의 모든 서버에 대한 총 가동 시간을 계산하여 시스템의 가용성을 평가할 수 있습니다.
• 서버별로 개별 가동 시간을 분석하고, 이를 종합해 전체 인프라의 상태를 파악하는 데 유용합니다.
쿼리의 차별점
• 쿼리 1: 서버별로 나누지 않고 전체 합산만 수행.
• 쿼리 2: 서버별로 가동 시간을 계산한 뒤, 이를 다시 합산.
• 서버별 분석 결과를 제공하면서도 총합 계산이 가능하다는 점에서 더 유연합니다.