데이터 분석

[day20] 다양한 쿼리를 많이 접해보자.

경 민 2025. 3. 7. 20:56
더보기

👩🏻‍💻  TODAY I LEARN

1. SQL 코드카타 

2. 라이브 세션 - python

3. 아티클 미션

4. SQLD 시험 준비

- 이기적 최신기출

- 헷갈리는 부분 정리한 거, 오답 훑어보기

1.  코드카타

1) mysql에서 데이터 길이 조회 방법
당당하게 len 썼다가 틀렸다. .

** mysql 에서는 len 지원 안 됨 ! **

  • length : 문자열의 byte 길이 반환
  • char_length : 문자열 길이 반환 (literary) 

🔶 예시

- LENGTH()

SELECT LENGTH(12345);
결괏값: 5

SELECT LENGTH('Hello');
결괏값: 5

SELECT LENGTH('안녕');
결괏값: 6

 

- CHAR_LENGTH()

SELECT CHAR_LENGTH(12345);
결괏값: 5

SELECT CHAR_LENGTH('Hello');
결괏값: 5

SELECT CHAR_LENGTH('안녕');
결괏값: 2

 

한글 문자열의 길이 조회하고 싶을 때는 char_length()를 사용하자.

↪︎ 참고 링크

https://wnwa.tistory.com/29

 

2) 코드카타 85번

Q. 전날보다 기온이 올라간 id 구하기

방법1. LAG 함수 사용

select id
from
	(
	select *,
	lag(temperature,1) over() as yes_tem
	from weather
	) a
where temperature > yes_tem

 

문제 보자마자 어제 공부한 LAG 함수가 생각났다.

이 문제는 테이블 자체가 이미 오름차순으로 정렬되어있어서 따로 정렬을 주지는 않았지만

그렇지 않다면

LAG(temperature,1) over(order by recorddate) 으로 해줘야 한다.

이유 : 바로 직전날의 temperature를 가져오고 싶기 때문에

 

방법2. 셀프 조인

select w1.id
from weather w1, weather w2
where 
	w1.recorddate = w2.recorddate + 1
	and
	w1.temperature > w2.temperature

"recorddate가 하루 뒤인 행과 조인해줘"

 

조인 조건 첫 번째를 잘 기억해두자.

저런식으로도 조인을 해줄 수 있다 ! 

 

3) 코드카타 86번

Q. machine_id별 프로세스 작동 시간의 평균 구하기

방법1. activity_type별로 테이블 분리한 후 조인

select 
    a.machine_id,
    round(avg(b.end - a.start),3) as processing_time
from
(select 
    machine_id,
    process_id,
    timestamp as start
from activity
where activity_type = 'start'
group by machine_id, process_id) a
join
(select 
     machine_id,
    process_id,
    timestamp as end
from activity
where activity_type = 'end'
group by machine_id, process_id) b
on a.machine_id = b.machine_id
    and a.process_id = b.process_id
group by machine_id

너무 1차원적으로 접근했음. ...

피벗을 하고 싶다는 생각이 들기도 했다.

우선 더 좋은 방법이 있을 것 같아 다른 분들의 쿼리를 학습했다.

 

방법2. end인 행만 뽑은 테이블을 inner join 

SELECT
    a.machine_id,
    a.process_id,
    e.timestamp-a.timestamp as time
FROM 
    activity a
INNER JOIN 
    (
    SELECT machine_id, process_id, timestamp
    FROM activity
    WHERE activity_type = 'end'
    ) e
ON a.machine_id = e.machine_id 
    AND a.process_id = e.process_id
    AND a.activity_type = 'start'

굳이 start, end 별로 테이블 2개 만들 필요가 없다.

원래 테이블에 end 행만 뽑은 테이블 조인 시켜주면 됨 !

 

방법 3. group by해주면 end = max() , start = min() 👍🏼👍🏼👍🏼👍🏼👍🏼

SELECT
    machine_id,
    process_id,
    max(timestamp) - min(timestamp) as time
FROM activity
GROUP BY 
    machine_id, 
    process_id

가장 간단하다.

머신, 프로세스별로 그룹핑해주면 end 값은 max로, start값은 min으로 출력 가능하다.

이 쿼리는 그루핑의 의미와 역할을 잘 활용한 것 같다.


2.  라이브 세션 - Python

1️⃣ 파이썬에서 자주 실수하는 유형

1) 함수 정의 후 return 해주기

def greet():
	print('Hello!')
    
message = greet()
print(message)

 

출력값 : Hello, None

ㄴ 반환값이 없기 때문에 None 출력됨

print 대신 return 을 써서 반환값을 만들어주자 !!

def greet():
 return "Hello!"

message = greet()
print(message)

 

2) 파이썬은 들여쓰기의 문법이다. 오류가 생겼다면 탭을 살펴보자.


3. 아티클 미션

https://rosenps3.tistory.com/39

 

[아티클 미션] -14 가설 검증

1. 가설 설정2. 가설 검증 방법 설정3. 검증 지표, 목표 수치 설정4. 실험 기간 설정 및 진행5. 데이터 분석 및 가설 검증6. 인사이트 도출 1. 가설 설정 우선순위를 세우고 가장 가치가 높은 가설을

rosenps3.tistory.com

새롭게 만난 팀에서는 화, 금요일 주 2회 하기로 정했다.

오늘은 가설 검증에 관한 첫 번째 아티클!