이번주 공부한 것들
if/case when 조건문 활용
문제 95. 1633. Percentage of Users Attended a Contest
We define query quality as:
The average of the ratio between query rating and its position.
We also define poor query percentage as:
The percentage of all queries with rating less than 3.
Write a solution to find each query_name, the quality and poor_query_percentage.
Both quality and poor_query_percentage should be rounded to 2 decimal places.
Return the result table in any order.
The result format is in the following example.
select query_name,
round(avg(rating/position), 2) as quality,
round((select count(*) from queries where query_name = q1.query_name and rating <3)/count(*)*100, 2) as poor_query_percentage
from queries q1
where query_name is not null
group by 1
크게 어렵진 않았는데 효율성이 떨어져서 다른 답들을 보니
select query_name,
round(avg(rating/position), 2) as quality,
round(sum(if(rating < 3, 1, 0))/count(*)*100, 2) as poor_query_percentage
from queries
where query_name is not null
group by 1
SELECT
query_name,
ROUND(AVG(rating/position), 2) AS quality,
ROUND(SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) AS poor_query_percentage
FROM
Queries
WHERE query_name is not null
GROUP BY
query_name;
if나 case when을 사용해서 훨씬 더 간단하게 쿼리를 작성할 수 있었음(둘 다 빠른데 왜인지 case when이 더 효율적이라고 나옴)!
서브쿼리 없이 작성할 수 있다는 것은 둘째 치고, 문제가 해당하는 케이스를 count 해주는 문제인데 조건문을 활용했다는 것이 신기했다. 앞으로 자주 쓰게 되는 방법이지 않을까?
일단 덕분에 아래 문제도 금방 쉽게 풀 수 있었음
문제96. 1193. Monthly Transactions I
select date_format(trans_date, '%Y-%m') as month,
country,
count(*) as trans_count,
sum(if(state = "approved", 1, 0)) as approved_count,
sum(amount) as trans_total_amount,
sum(if(state = "approved", amount, 0)) as approved_total_amount
from transactions
group by 1, 2;
case를 count하는 문제의 경우, 조건문을 사용해서 1과 0으로 치환해서 sum해줄 것!
count라고 반드시 count 함수를 써줘야하는 것은 아니다!
reverse(), reversed()
-리스트/문자의 원본 요소를 뒤집어줌
-reverse() : 리스트 매소드. 원본을 바꿈
-reversed() : 함수. 원본 요소 변경X 리스트/문자열/튜플을 역순으로 반복 가능한(iterable) 객체로 반환
def solution(n):
a = []
for i in reversed(str(n)):
a.append(i)
print(a)
n = 123
solution(n) #결과 : ['3', '2', '1']
Counter 함수
-collections 라이브러리 사용
-리스트 내의 각 요소를 count해서 그 요소와 개수를 딕셔너리로 출력함
participant = ["mike", "lisa", "tom", 'lisa']
from collections import Counter
print(Counter(participant))
#결과값 : Counter({'lisa': 2, 'mike': 1, 'tom': 1})
https://school.programmers.co.kr/learn/courses/30/lessons/42576
TMI
바쁘고 정신 없는 와중에 프로젝트 시작.
모든 프로젝트가 그러하듯, 시작은 막막했지만 논의하고 지지고 볶고 하다보니 꽤 순조롭게 되어가는듯?
주말에도 이삿짐 때문에 정신없지만,,,,조금이라도 쉬고서 재충전해서 마무리까지 잘 되길!