카테고리 없음

[TIL] 75일차

unoori 2025. 1. 24. 09:15

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: 서버별로 가동 시간을 계산한 뒤, 이를 다시 합산.

서버별 분석 결과를 제공하면서도 총합 계산이 가능하다는 점에서 더 유연합니다.