내일배움캠프_데이터분석_2기/TIL

[TIL] camp_day31_240529

단ee 2024. 5. 29. 23:44

오늘로 꽉 채운 한 달을 데이터 분석 공부에 투자했다. 주차로는 벌써 7주차라는 게 실감이 안 나지만...

학습 내용


  1. 나는 어렵게 풀었는데 다른 사람들은 엄청 쉽게 풀었던 문제 기록(SQL)

    • 문제 : 리트코드_두 번째로 높은 급여

    • SQL 라이브 강의 때 과제 쿼리도 그렇고, 다른 사람들 답을 보면 간결하게 작성하는데 내 쿼리는 늘 구구절절문이라 남기는 기록.

    • 최종적으로 풀이한 쿼리도 짧아진 편인데, 내가 열 몇 줄로 코딩한 걸 다른 사람들은 세 줄로 끝내서 살짝 충격이었다.

        SQL
        # 내가 작성한 쿼리
      
        SELECT
            IFNULL(MAX(salary),NULL) AS SecondHighestSalary
        FROM
            (
            SELECT
                CASE 
                    WHEN 2 = DENSE_RANK() OVER(ORDER BY salary DESC)
                            -- RANK() 로 구했더니 공동 1등 다음 2등 없이 3등이 오는 문제 발생
                        THEN salary
                    ELSE NULL END AS salary
            FROM Employee
            ) AS es
    • OFFSET : LIMIT 다음에 쓴다. LIMIT가 출력할 행의 개수를 제한한다면, OFFSET은 몇 번째 위치부터 행을 출력할 지 나타낸다.

      1. LIMIT 10 OFFSET 5 : 5번째 행부터 10개 행을 출력한다. 제일 첫 번째 행은 OFFSET 0 이므로, 여섯 번째 행 ~ 열다섯 번째 행 출력

      2. LIMIT 1 OFFSET 1 : 따라서, 아래 쿼리문에서 이렇게 쓰면 두 번째 행에서 시작해서 한 개의 행만 출력한다.

        SQL
        # LIMIT 절에 OFFSET을 활용하는 답
        
        SELECT 
         (
         SELECT DISTINCT salary 
         FROM employee
         ORDER BY salary DESC
         LIMIT 1 OFFSET 1) AS SecondHighestSalary
    • WHERE 절에 MAX값을 제외하라는 조건을 거는 것

      • OFFSET은 정말 몰라서 활용을 못 했다면, 아래 쿼리는 왜 이렇게 생각하지 못했을까 하고 스스로를 반성하게 됐다.
      • max값을 구하되, 가장 높은 salary 값을 제외하고 max 값을 구한다면 당연히 두 번째로 높은 salary 값을 출력한다.
      • 물론 아래 쿼리를 사용하면 조건이 달라진다면(세 번째로 높은, 네 번째로 높은 salary를 구한다면?) 조금 제약이 있겠지만
        그래도 나한테는 충격적인 쿼리문이었다.
        SQL
        SELECT max(salary) AS SecondHighestSalary
        FROM Employee 
        WHERE Salary != (SELECT max(salary) FROM Employee)
  2. CASE WHEN 구문 쓸 때 쿼리문 다듬기(SQL)

    • 지난 주 화요일 SQL 세션에서 튜터님께서 쿼리 스타일 가이드에 대해 소개해주셨다.

    • 그 이후로 쿼리를 작성할 때 가능한 보기 좋게 작성하려고 노력하는 중이다.
      예약어는 대문자로 쓰고, alias 앞에 AS를 쓰고. 서브쿼리는 들여쓰기 간격을 맞추고 이런 자잘한 습관을 들이고 있다.

    • 과제 풀이를 하다가 CASE WHEN 문을 좀 많이 썼는데, 깔끔하게 쓰는 방법이 뭘까 싶어서 검색해보았다. SQL 스타일 가이드

        SQL
      
        CASE
            WHEN column_1 = 1
                THEN 'small'
            WHEN column_1 = 2
                THEN 'medium'
            ELSE 'large'
        END AS column_name
      
        -- note_ 위와 같이 작성해도 좋지만, 아래와 같이 CASE ~ WHEN 사이에 조건을 명시하여 더 간결하게 작성 가능하다.
        CASE column_1
            WHEN 1
                THEN 'small'
            WHEN 2
                THEN 'medium'
            ELSE 'large'
        END AS column_name
      

고찰 & 기타


  • SQL은 그래도 어느 정도 잘 사용할 수 있다고 생각했는데, 막상 과제를 받아서(퍼널 분석을 과제로 연습하고 있다) 풀어보려고 하니까 잘 안 써졌다. 내일까지 과제를 써야 하는데 걱정이다. 파이썬은 SQL 보다 부족한 것 같은데, 앞으로 얼마나 시간을 더 들여서 공부해야 할지, 사실 가늠이 잘 안 된다.
  • 쿼리나 코드를 작성할 때 예기치 않게 글쓰기 습관이 튀어나오는 것 같다.
    평소에 글을 쓸 때도 수식어를 많이 쓴다거나, 문장이 하염없이 길어진다 같은 특징이 있는데 이게 내 쿼리에도 묻어 나오는 듯 하다.
    하지만 나의 목표는 언제나 "pythonic 한 코드/쿼리 작성하기" 이므로,
    간결하고 직관적인 코드/쿼리를 작성할 수 있도록 스타일을 개선해야 겠다.
  • 약한 감기 몸살로 컨디션이 좋지 않았는데 오랜만에 밖에 나가서 점심 먹고 카페 가서 공부하니 조금 환기가 되었는지 컨디션이 돌아왔다.
  • 밀린 TIL, WIL 빨리 채우고, 앞으로는 밀리지 않아야겠다. 아자!

'내일배움캠프_데이터분석_2기 > TIL' 카테고리의 다른 글

[TIL] camp_day33_240531  (1) 2024.06.03
[TIL] camp_day32_240530  (0) 2024.05.30
[TIL] camp_day30_240528  (0) 2024.05.28
[TIL] camp_day29_240527  (0) 2024.05.28
[TIL] camp_day28_240524  (0) 2024.05.24