TIL

2024-04-09

여연찌 2024. 4. 9. 17:38
  • Today

1. ADsP 강의

2. SQL 코드카타

3. 파이썬 코드카타

 


  • Today I Learned

 

SQL

 

리뷰를 가장 많이 작성한 회원의 리뷰를 조회

SELECT member_name, review_text, review_date
FROM MEMBER_PROFILE p JOIN rest_review r ON p.member_id=r.member_id
WHERE p.member_id =
(
SELECT member_id, COUNT(review_id)
FROM rest_review 
GROUP BY member_id
ORDER BY 2 DESC
LIMIT 1
)

수월하게 where 절 서브쿼리 작성을 했다고 생각을 했는데

Operand should contain 1 column(s)

예~ 또다시 오류가 떴고요

왼쪽은 1개 컬럼, 오른쪽은 2개의 컬럼이라서 오류가 발생했다.

WHERE (p.member_id,review_id) IN

IN 으로 바꾸어 주었더니 이번에도 새로운 오류 발생

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

MySQL 에서는 서브쿼리에서 In과 limit 를 사용할 수 없다고 한다..

나는 제일 높은 사람을 뽑아야 하는데.. 

그럼 메인쿼리에서 LIMIT 를 써주면 되지 않을까 해서 

SELECT member_name, review_text, review_date
FROM MEMBER_PROFILE p JOIN rest_review r ON p.member_id=r.member_id
WHERE (p.member_id, review_id) IN
(
SELECT member_id, COUNT(review_id)
FROM rest_review 
GROUP BY member_id
)

이렇게 쿼리를 짜봤더니 결과가 하나도 안나왔음!

당연함 서브쿼리에서는 리뷰아이디를 카운트 해줬기 때문에,,,

 

다시 찾아봄..

나는 멤버 아이디 하나만 뽑아도 되니, 서브쿼리 칼럼에서는 멤버아이디만 뽑혀도 됐음..

여기서 잊고 있던 개념 하나 찾게 되었다 ㅠㅜ

ORDER BY 에서도 COUNT 가넝함 ... 

ORDER BY 에서 컬럼을 사용하기 위해 꼭 SELECT 절에 없어도 된다!!

SELECT member_name, review_text, DATE_FORMAT(review_date,'%Y-%m-%d') REVIEW_DATE
FROM MEMBER_PROFILE p JOIN rest_review r ON p.member_id=r.member_id
WHERE p.member_id =
(
SELECT member_id
FROM rest_review 
GROUP BY member_id
ORDER BY COUNT(review_id) DESC
LIMIT 1
)
ORDER BY 3, 2

 

결국 완성~~!

이제 where 절 서브쿼리는 어떻게든 정리가 되어 가고 있는 듯 하다.

 

 

 

테이블 두개의 데이터 통합하기

SELECT *
FROM online_sale o
WHERE sales_date LIKE '2022-03%'
UNION ALL
SELECT *
FROM offline_sale f
WHERE sales_date LIKE '2022-03%'

일단 중복값도 포함해서 전부다 뽑아내기 위해 어제 사용해보았던

UNION ALL 을 사용!

 

The used SELECT statements have a different number of columns

 

넹 오류가 발생했고요

테이블의 컬럼수가 달라서 발생했다.

 

그래서 컬럼수를 일치시켜보았다

offline 테이블에는 user_id 라는 컬럼이 없었는데, 문제에서 NULL 로 표시해달라고 함!

SELECT DATE_FORMAT(sales_date,'%Y-%m-%d') SALES_DATE,product_id, user_id, sales_amount
FROM online_sale o
WHERE sales_date LIKE '2022-03%'
UNION ALL
SELECT DATE_FORMAT(sales_date,'%Y-%m-%d') SALES_DATE,product_id, NULL, sales_amount
FROM offline_sale f
WHERE sales_date LIKE '2022-03%'
ORDER BY 1, 2, 3

완성

 

UNINON ALL 을 하게 되면

중복값 포함하여 전부다 합쳐진다

컬럼내에 비어져 있는 데이터가 있다면 값 자체에 null 을 입력하도록 명시해주면 된다..

NULL 을 어떻게 입력해야 할까 했는데 그냥 NULL 을 입력해주면 됐던 것...

오프라인 테이블에는 3월 데이터가 없어서 null 이 나오지 않았지만 데이터가 있던 달로 실행해보니

이렇게 user_id 가 비어있는 결과가 나온다!

만약 글자 null 을 넣어주고 싶었다면

SELECT DATE_FORMAT(sales_date,'%Y-%m-%d') SALES_DATE,product_id, 'NULL', sales_amount

이렇게 입력해주면 됨!

 


파이썬

주어진 정수 배열 중 없는 숫자 더하기

for in range 를 사용해서 반복을 해주는 것 까지 작성했으나

리스트 안에 있는 숫자들만 제외하는 것을 찾지 못했다..

 

range(0,numbers)   # 오류

for i in numbers   # 배열안의 숫자들만 반복해줌

 

문제의 제한사항에 numbers 의 길이는 0부터 9를 주었다.

def solution(numbers):
    answer = 0
    for i in range(0,10):
        if i in numbers:
            continue
        elif i not in numbers:
            answer += i
    return answer

in 이 그냥 단순 구문인줄 알았는데 

리스트 안에 있다 없다를 구문하는 거였음..

 

리스트 안에 없다 not in 을 사용해서 간단히 더해주었다!

break 만 알고 continue 는 몰랐는데 

코드를 건너뛰어 주는 문!

 

 

제일 작은 수 제거하기

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

 

제일 작은 수 제거하기 # del , remove(), min()

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1

lyj-01.tistory.com

첫번째 조건인 작으면 추가를 해주기 위해 for 반복문 작성

def solution(arr):
    answer = []
    for i in arr:
        if i < arr:
            answer.append[i]
    return answer

TypeError: '<' not supported between instances of 'int' and 'list'

 

< 는 int 와 list 와 비교할 수 없다고 함

 

리스트 원소의 작은 수와 큰 수 구하기

min() max()

리스트 요소를 삭제해주기

list.remove()

를 사용 해주었다

def solution(arr):
    if len(arr)==1: 
        arr.append(-1)
    elif len(arr)>=2:
        arr.remove(min(arr))
    return arr

아쉽.. 

10 대신에 -1이 들어가야하는데 

10을 삭제 하는 방법을 찾아보았다

 

리스트 내의 요소 삭제

del list[인덱스]

def solution(arr):
    if len(arr)==1: 
        del arr[0]
        arr.append(-1)
    elif len(arr)>=2:
        arr.remove(min(arr))
    return arr

드디어 성공!!!

 

 

가운데 글자 가져오기

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

 

가운데 글자 가져오기 # 슬라이싱

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다. s는 길이가 1 이상, 100이하인 스트링입니다. def solution(s): answer = '' if

lyj-01.tistory.com

슬라이싱이 아직 익숙하지 않아 꽤나 헤맸던 문제이다.
[:3] 이 경우 3-1 로 생각해서 인덱스 0부터 2까지 가져온다 로 정의하면 될 듯 !

[3:] 이 경우 3 그대로 인덱스 3부터 끝까지 가져온다

 

인덱스는 0부터 시작!

 

 


  • Next

1. ADsP 강의

2. 파이썬 코드카타

3. SQL 코드카타

 

'TIL' 카테고리의 다른 글

2024-04-12  (0) 2024.04.12
2024-04-11  (0) 2024.04.11
2024-04-08  (0) 2024.04.08
2024-04-05  (0) 2024.04.05
2024-04-04  (0) 2024.04.04