데이터 분석

[day23] SQL-스칼라 서브쿼리에서 조건주기, 파이썬- 조건문/반복문

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

👩🏻‍💻  TODAY I LEARN

📌 SQL

- 코드카타 제한시간 두고 풀기

📌 Python 

- 종합반 강의 3주차

- 코드카타 

1. SQL 

1-1. 코드카타 제한시간 두고 풀기

 

1) 코드카타 95번

방법1. 서브쿼리 ⭐️⭐️

SELECT  q.query_name
        ,ROUND(AVG(q.rating/q.position),2) quality
        ,ROUND((
            SELECT COUNT(*) FROM queries q2 
            WHERE 
                rating < 3
                  AND q.query_name = q2.query_name 
            GROUP BY query_name) / COUNT(*)*100,2) poor_query_percentage
FROM queries q
GROUP BY 1

⭐️ 중요 !!! 

반드시 q.query_name = q2.query_name 조건을 줘야한다.

이유 : 서브쿼리에서 추출되는 count(*)가 query_name 별로 나와야하기 때문

 

이 방법을 몰라서 rating < 3 일 때와 전체일 때를 각각의 서브쿼리로 만들어서 조인시키고,

거기서 나누기 해줬다. 하면서도 이거 더 짧게 쓸 수 있을 거 같은데.. 싶었는데

일단 내가 생각하는 방향이 논리적으로 맞는지 확인해보고 싶어서 계속 이어갔다.

select
	aa.query_name,
	aa.quality,
	bb.dd
from
(select 
	query_name,
	round(avg(rating/positions),2) as quality
from queries
group by 1) aa
join
(
select a.query_name, round(a.cnt_less3 / b.cnt_all * 100,2) as dd
from
(select
	query_name,
	count(1) cnt_less3
from queries
where rating < 3
group by 1) a
join
(select 
	query_name,
	count(1) cnt_all
from queries
group by 1) b 
on a.query_name = b.query_name) bb
on aa.query_name = bb.query_name

정말 길디 길고 길디 긴 쿼리 등장 .. 

논리적으로 맞긴 맞았음..

 

☑️ 결론

그룹핑이 필요없는 count 였으면 그냥 바로 cross join 시켜도 되지만,

이 문제는 그룹별로 count해야 한다.

  • 때문에 query_name이 일치하는 애들끼리 join 시켜야 하고
  • 그 방법은 스칼라 서브쿼리 안에서 조건으로 묶어주면 된다.

"메인 쿼리 테이블의 query_name 과 서브쿼리 테이블의 query_name이 일치하면 값을 집어넣어줘"

 

 

방법2. 'rating < 3 then 1 else 0' 칼럼 생성

SELECT
    query_name,
    ROUND(AVG(rating/position),2) AS quality,
    ROUND(SUM(IF(rating < 3, 1,0)) / count(1) * 100, 2) AS poor_query_percentage
FROM queries
GROUP BY query_name

 

"rating < 3 이면 1 아니면 0을 출력하고,

그걸 query_name 별로 sum해줘. (rating < 3 조건을 만족하는 수)"

 

조건이 TRUE이면 1, FALSE이면 0 값을 집어 넣어서 count하는 방법

 

2. Python  

2-1. 종합반 강의 3주차

1) if 조건문

2) for ~ in 반복문

3) while문

 

2-2. 코드카타

1) 나눗셈 

  • 나누기 : / 
  • 몫 : //
  • 나머지 : %

🔶 예시

 

2) 리스트 평균 구하는 방법

 

방법1. sum 함수 사용하기

def solution(numbers):
    return sum(numbers) / len(numbers)

❌ 혹시 avg 사용할 수 있나 했지만 -> 사용 불가

⭕️ 리스트 전체 sum 하고, len 함수 이용해서 항목 개수 구해준 후 나눠주었다.

 

방법2. 반복문으로 sum하기

def solution(numbers):
    answer = 0
    for i in numbers:
        answer += i
    return answer/len(numbers)

 

"answer 이라는 변수를 만들어주고,

값을 반복해서 더해주면서 전체 sum 값을 구함."

 

반복문 활용해보았다.

이 문제에서는 쉬운 응용이지만 이런 변수 지정하는 연습을 많이 해줘야할 듯.

'데이터 분석' 카테고리의 다른 글

[day25] SQL : Python = 1 : 9  (0) 2025.03.12
[day24] 중꺾그마...?  (0) 2025.03.11
[day21] 3주차 WIL  (1) 2025.03.08
[day20] 다양한 쿼리를 많이 접해보자.  (0) 2025.03.07
[day1] 퍼포먼스 마케터 직무 조사  (0) 2025.02.17