Tools/- SQL

[SQL] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์˜ˆ์ œ | ๋ฌผ๊ณ ๊ธฐ ์ข…๋ฅ˜ ๋ณ„ ๋Œ€์–ด ์ฐพ๊ธฐ

์Šค์œ„๋ฏผ 2025. 1. 17. 15:22

๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/293261

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 

์ฝ”๋“œ

with rank_info as (
    select id, fish_type, length,
        rank() over (partition by fish_type order by length desc) as ranking
    from fish_info
)

select r.id, n.fish_name, length
from rank_info r
join fish_name_info n
on r.fish_type = n.fish_type
where r.ranking = 1
order by 1 asc

rank()๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ต์•ˆ

 

select f.id, n.fish_name, f.length
from fish_info f
join fish_name_info n
on f.fish_type = n.fish_type
where (f.fish_type, f.length) in 
    (select fish_type, max(length)
     from fish_info
     group by fish_type)
order by 1 asc

์ด๋ ‡๊ฒŒ๋„ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฐ ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์ข€ ๋” ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค.

 

ํ•ต์‹ฌ ์š”์ง€

1. group by ๊ทœ์น™ ์ดํ•ดํ•˜๊ธฐ

select fish_type, id, max(length)
from fish_info
group by fish_type

 

์ฒ˜์Œ์—๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, group by์ ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ, select์— ์„ ํƒ๋œ ๋ชจ๋“  ์ปฌ๋Ÿผ์€ ์ง‘๊ณ„ํ•จ์ˆ˜ (max, sum, count)๋กœ ๋ฌถ์ด๊ฑฐ๋‚˜ group by์ ˆ์— ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ์ด ์ฟผ๋ฆฌ์—์„œ๋Š” ์–ด๋–ค id๋ฅผ ๊ฐ€์ ธ์˜ฌ์ง€ ๋ชฐ๋ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฒŒ ๋œ๋‹ค.

 

๊ฒฐ๊ตญ, ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๋ฌผ๊ณ ๊ธฐ ์ข…๋ฅ˜์˜ id๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๋œ๋‹ค.

 

2. where์ ˆ์— ๋‘ ์ปฌ๋Ÿผ์„ ํ•œ ์Œ์œผ๋กœ ๋น„๊ตํ•˜๊ธฐ

 

where (a, b) in (๋‘ ์ปฌ๋Ÿผ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ)

: ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋ฉด ๋‘ ์ปฌ๋Ÿผ์„ ํ•œ ์Œ์œผ๋กœ ๊ฐ€์ ธ์™€์„œ ์ผ์น˜ํ•˜๋Š” ํ–‰์˜ ๊ฐ’์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. rank() over () ์‚ฌ์šฉํ•˜๊ธฐ

 

์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•  ๋•Œ rank(), dense_rank(), row_number()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ง๊ด€์ ์ด์ง€ ์•Š๋‚˜์‹ถ๋‹ค.

rank() - ๊ฐ™์€ ๊ฐ’์€ ๊ฐ™์€ ์ˆœ์œ„๋กœ, 1 1 3

dense_rank() - ๊ฐ™์€ ๊ฐ’์€ ๊ฐ™์€ ์ˆœ์œ„๋กœ, 1 1 2

row_number() - ๊ฐ™์€ ์ˆœ์œ„ ์—†์ด 1 2 3

 

rank๋กœ ์ˆœ์œ„๋ฅผ ๋งค๊ฒผ์„ ๋•Œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋“ฑ์ˆ˜๋ฅผ ๋งค๊ฒจ์ค˜์„œ order by ๋’ค์— desc๋ฅผ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค.