본문 바로가기

WIL

1/12 WIL

이번주 공부한 것들

if/case when 조건문 활용

문제 95. 1633. Percentage of Users Attended a Contest

 

 

Percentage of Users Attended a Contest - LeetCode

Can you solve this real interview question? Percentage of Users Attended a Contest - Table: Users +-------------+---------+ | Column Name | Type | +-------------+---------+ | user_id | int | | user_name | varchar | +-------------+---------+ user_id is the

leetcode.com

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

 

Monthly Transactions I - LeetCode

Can you solve this real interview question? Monthly Transactions I - Table: Transactions +---------------+---------+ | Column Name | Type | +---------------+---------+ | id | int | | country | varchar | | state | enum | | amount | int | | trans_date | date

leetcode.com

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

바쁘고 정신 없는 와중에 프로젝트 시작.

모든 프로젝트가 그러하듯, 시작은 막막했지만 논의하고 지지고 볶고 하다보니 꽤 순조롭게 되어가는듯?

주말에도 이삿짐 때문에 정신없지만,,,,조금이라도 쉬고서 재충전해서 마무리까지 잘 되길!

'WIL' 카테고리의 다른 글

WIL 02/02  (0) 2024.02.02
1/26 WIL  (0) 2024.01.26
01/05  (0) 2024.01.05
12월 마지막주(12/29) WIL  (0) 2023.12.29
12/22 WIL  (0) 2023.12.22