[스파르타코딩클럽]데이터분석 과정/SQL

[SQL 코드카타] 118~120번 (LeetCode)

doo_ 2024. 1. 29. 13:03

118번 investments-in-2016

SELECT 
    ROUND(SUM(tiv_2016), 2) AS tiv_2016
FROM Insurance
WHERE --1) 조건1 tiv_2015가 같은 tiv
    tiv_2015 IN (
                SELECT tiv_2015
                FROM Insurance
                GROUP BY tiv_2015
                HAVING COUNT(*) > 1
                )
    AND (lat, lon) IN ( --2) 조건2 lat과 lon이 서로 다른
                SELECT lat, lon
                FROM Insurance
                GROUP BY lat, lon
                HAVING COUNT(*) = 1
            )

> ? count 윈도우 함수 사용

select 
	ROUND(sum(tiv_2016), 2) tiv_2016
from (
    select *, 
        count(concat(lat, lon))over(partition by lat, lon order by lat, lon) numb,
        count(tiv_2015)over(partition by tiv_2015 order by tiv_2015) tf
    from Insurance
) a 
where 
    tf > 1 
    and numb = 1

119번 department-top-three-salaries

SELECT
    dp.name AS Department,
    ep.name AS Employee,
    ep.Salary
FROM (SELECT -- 1) 상위 3위인 봉급을 조회하기 위해 급여 순위 조회
        name,
        departmentID,
        salary,
        DENSE_RANK() over(partition by departmentID order by salary desc) as rn_salary
    FROM
        Employee
    ) ep
    join Department dp
    ON ep.departmentID = dp.id -- 2) 부서 이름을 가져오기 위해 조인
WHERE 
    rn_salary <= 3

 

120번 fix-names-in-a-table

> INITCAP()함수는 ORACLE에서만 제공

> UPPER() = UCASE() / LOWER() = LCASE()

SELECT --1) 문자열 자르기를 통해 실행
    user_id,
    CONCAT(UPPER(LEFT(name,1)),LOWER(SUBSTRING(name,2))) AS name
FROM
    Users
ORDER BY 
    user_id