TIL

2024-04-22

여연찌 2024. 4. 22. 20:30
  • Today

1. 새로운 주차 할 일 정리

2. SQL, 파이썬 코드카타

3. SQL 보충 세션 개인과제

4. ADsP (의사결정나무)

 


  • Today I Learned

 

SQL

 

SQL 코드카타 복습

https://lyj-01.tistory.com/51

 

SQL 코드카타

번호 이름 풀이날짜 44 가격대 별 상품 개수 구하기 4/12 45 3월에 태어난 여성 회원 목록 4/5 46 대여 기록이 존재하는 자동차 리스트 구하기 4/5 48 즐겨찾기가 가장 많은 식당 정보 출력하기 4/12 55

lyj-01.tistory.com

59번

SELECT car_id,
       IF (car_id IN (
        SELECT car_id
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE start_date <= '2022-10-16' AND end_date >= '2022-10-16'), '대여중', '대여 가능') AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
ORDER BY 1 DESC


# SELECT car_id
# FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
# WHERE start_date <= '2022-10-16' AND end_date >= '2022-10-16'

 

메인쿼리와 서브쿼리를 이어주려면

IN , = , ANY 등 같은 연산자를 사용해주어야 한다!

서브쿼리로 10/16 특정 날짜를 뽑아내는 것 까지는 완성했는데 IF 절 구문의 서브쿼리에서 헤맸다..

다시 복습해야할 듯 !

 

67번

WITH so AS
(SELECT flavor
     , SUM(total_order) sum_order
FROM JULY
GROUP BY 1
UNION
SELECT flavor
     , SUM(total_order) sum_order
FROM FIRST_HALF
GROUP BY 1
)

SELECT flavor
FROM so
ORDER BY sum_order DESC
LIMIT 3

WITH 구문을 사용하여 풀이해보려고 했는데..

실행은 되지만 정답이 아니었다.

 

튜터님께 여쭤보니

위의 코드는 테이블을 합쳐주기만 할 뿐 sum_order 를 더해주는 연산작업을 해주는 것이 아니었다!

order by 에서 sum 을 해주어야 하지만, 그러기 위해서는 또 flavor 를 group by 를 해주어야 한다

SELECT flavor
FROM so
GROUP BY flavor
ORDER BY SUM(sum_order) DESC
LIMIT 3

 

 

테이블의 각각의 합이 아닌 두 테이블의 합을 구해야 하는 문제이기 때문에

다음에는 위와 같은 방법이 아닌 아래의 쿼리문을 참고해서 작성해야겠다!

# WITH 구문 사용
WITH total AS (
SELECT *
FROM first_half

UNION ALL

SELECT *
FROM july
)

SELECT flavor
FROM total
GROUP BY flavor
ORDER BY SUM(total_order) DESC
LIMIT 3


# FROM 절 sub-Quary
SELECT flavor
FROM 
(SELECT *
FROM july
UNION ALL
SELECT *
FROM first_half
) a
GROUP BY 1
ORDER BY SUM(total_order) DESC
LIMIT 3

 

 


파이썬

 

 

부족한 금액 계산하기

def solution(price, money, count):
    answer = money
    for n in count:
        answer -= price * n
    return answer

# 첫 번째 시도..

money 에서 price * n 을 빼주면

금액에서 가격*n번 을 빼주는 거라고 생각했으나 오류가 떴다.

 

int 형식이어서.. range를 써주어 보았다.

def solution(price, money, count):
    answer = money
    for n in range(1,count+1):
        answer -= price * n
    return answer

def solution(price, money, count):
    answer = money
    for n in range(1,count+1):
        answer -= price * n
    return -(answer)

오.. -() 이렇게 하면 양수로 바꾸어 줄 수 있구나

하지만 문제에서 원하는 답이 아님!

 

다른 사람의 풀이를 보았더니 이런 코드가 있었다.

내가 생각한 그대로의 풀이

def solution(price, money, count):
    answer = 0
    for n in range(1,count+1):
        answer += price * n
    if answer < money:
        return 0
    else:
        return answer - money

 

price * n 해준 값인 answer 가 money 보다 작으면 0 을 반환

money 보다 크면 answer - money 를 해준다.

 

Q. for n in count 를 하게 되면?

A. count 가 배열이 아닌 숫자이기 때문에 반복을 해줄 수가 없다!

for 문은 iterable, 반복할 수 있는 개체가 와야하기 때문에 숫자형만 올 경우에는 사용 불가하다

range(1,count+1) 

를 하게 되면 1부터 count 까지의 숫자를 반복하도록 작성할 수 있다.

 

 

 


SQL 보충 세션

 

① SQL 문의 마지막은 ; 세미콜론으로 끝내기

② 같은 레벨의 논리 연산자를 쓸 때에는 괄호() 를 작성해줘야 한다.

SELECT *
FROM basic.theglory 
WHERE 날짜 IS NOT NULL
	AND (성별!='M')
	AND (직업=('아나운서' OR '승무원' OR '화가'))-- 또는, 직업 IN('아나운서','승무원','화가')
	AND (나이 BETWEEN 30 AND 40) -- 30 이상, 40 이하

③ ORDER BY 또는 GROUP BY 에서 컬럼값 1번 2번 등으로 작성해도 된다.

다만,  MySQL 에서는 컬럼값이 1번부터 시작되지만 다른 환경에서는 0번부터 시작될 수 있으니 되도록 이면 컬럼명으로 작성하는 것을 추천!

 

 

과제중에 10 level 별로 구분하는 숙제가 있었는데 나는 BETWEEN 을 사용하며 하나하나씩 적어주었다.

SELECT game_actor_id
     , level 
 	 , CASE WHEN level <= 10 THEN '1~10lv'
 	        WHEN level BETWEEN 11 AND 20 THEN '11~20lv' 
 	        WHEN level BETWEEN 21 AND 30 THEN '21~30lv' 
 	        WHEN level BETWEEN 31 AND 40 THEN '31~40lv'
 	        WHEN level BETWEEN 41 AND 50 THEN '41~50lv' 
 	        WHEN level BETWEEN 51 AND 60 THEN '51~60lv' 
 	        WHEN level BETWEEN 61 AND 70 THEN '61~70lv' 
 	        WHEN level BETWEEN 71 AND 80 THEN '71~80lv'
 	        WHEN level BETWEEN 81 AND 90 THEN '81~90lv'
 	        ELSE '91~100lv'
	   	END 'levelgroup'
	  , date
FROM users 
ORDER BY date DESC;

팀원분들과 과제에 관하여 이야기 중 이미 10레벨에서 끊어주었기 때문에

이 다음 WHEN 문에서 10레벨에 관한 구문은 적어주지 않아도 됐었다..

SELECT game_actor_id
     , level 
 	 , CASE WHEN level <= 10 THEN '1~10lv'
 	        WHEN level <= 20 THEN '11~20lv' 
 	        WHEN level <= 30 THEN '21~30lv' 
 	        WHEN level <= 40 THEN '31~40lv'
 	        WHEN level <= 50 THEN '41~50lv' 
 	        WHEN level <= 60 THEN '51~60lv' 
 	        WHEN level <= 70 THEN '61~70lv' 
 	        WHEN level <= 80 THEN '71~80lv'
 	        WHEN level <= 90 THEN '81~90lv'
 	        ELSE '91~100lv'
	   	END 'levelgroup'
	  , date
FROM users 
ORDER BY date DESC;

이렇게!!

 

보충 세션에서 CASE WHEN 절의 작동 순서는 가장 상단부터 참과 거짓을 구분하고, 

그 다음 WHEN 절을 수행한다고 했다.

이 점을 잘 기억해두었다가 이후 조금더 간결한 쿼리문을 작성할 수 있도록 해야겠다!

 

그리고 디비버에서 실행 중 컬럼명 date 와 level 에서 자꾸 `` 이 표시가 뜨는데

백틱 이라고 불린다.

SQL 함수중 date 와 level 에 관한 함수가 있기 때문에 구분될 수 있도록 백틱 표시로 자동완성이 되는 것

`date`  이렇게 쓰여도 됨! 

 

 

포함하지 않은 값을 출력하고 싶을 때

SELECT date
     , ip_addr 
     , exp
     , zone_id 
     , etc_str2
FROM USERS
WHERE level > 10 
	AND NOT SERVERNO = '1'   # 이런식은 잘 쓰지 않기때문에 != 1 을 쓰는 걸 추천
	AND (etc_str2 IN ('레벨업 패키지','시즌패스')) 
	# AND (etc_str2 = ('레벨업 패키지' OR '시즌패스')) 
	AND (etc_str1 LIKE '상점%')
ORDER BY date DESC;

나도 처음에 IS NOT 1 했다가 오류가 나왔었는데

팀원분이 마침 튜터님께 여쭤보고 왔다고 한다!

NOT 을 쓰고 싶다면 컬럼명 앞에 적어주면 되지만 추천하지 않는다


  • Next

1. SQL, 파이썬 코드카타

2. SQL 코드카타 복습

3. SQL 보충 세션

4. 개인과제

'TIL' 카테고리의 다른 글

2024-04-24  (0) 2024.04.24
2024-04-23  (0) 2024.04.23
2024-04-19  (0) 2024.04.19
2024-04-18  (1) 2024.04.18
2024-04-17  (0) 2024.04.17