[TIL] MySQL TIL Day 5

1 ๋ถ„ ์†Œ์š”

๐ŸŸก [HackerRank] Weather Observation Station 20

https://www.hackerrank.com/challenges/weather-observation-station-20/problem?isFullScreen=true

Solution

์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ โ€˜median ํ•จ์ˆ˜๋ฅผ ์จ์•ผ์ง€!โ€™ ๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค๊ฐ„ ํฐ์ผ๋‚œ๋‹ค. Oracle์—์„œ๋Š” MEDIAN ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ mySQL์—์„œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•„ ์ง์ ‘ median์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ lat_n์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ›„, ๊ฐ ํ–‰์— ํ–‰ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ ํ›„ Median์„ ๊ตฌํ•˜๋Š” ์ˆ˜์‹์„ ์ด์šฉํ•ด ์ •๋‹ต์„ ์ฐพ๋Š”๋‹ค.

SET

mySQL์—์„œ SET์€ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์“ฐ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ๋ณ€์ˆ˜๋งŒ์œผ๋กœ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, SET์„ ์ด์šฉํ•ด ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด ๋ฌธ์ œ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ–‰ ๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.


์˜ˆ์‹œ

SET @rownum = -1; % ์„ธ๋ฏธ์ฝœ๋ก  ํ•„์ˆ˜
SELECT @rownum := rownum + 1 AS rnum
FROM station

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด rownum์ด 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ $0, 1, 2, 3, \dots$ ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ–‰ ๋ฒˆํ˜ธ๋ฅผ 0๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ง€์ •ํ•ด์ค€๋‹ค. ๋‹จ, ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” lat_n์„ ๋จผ์ € ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ํ›„ ํ–‰ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•ด์•ผ ํ•œ๋‹ค. ํ’€์ด๋Š” ์•„๋ž˜ ์ฝ”๋“œ์— ์žˆ๋‹ค.

Code

๋งจ ์•„๋ž˜ WHERE ์ ˆ์ด ๋ฐ”๋กœ median์„ ์ฐพ๋Š” ์ฝ”๋“œ์ธ๋ฐ, ์ด ๋•Œ median์— ํ•ด๋‹นํ•˜๋Š” ํ–‰ ๋ฒˆํ˜ธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” @rownum ์„ ์ด์šฉํ•œ๋‹ค. @rownum := @rownum + 1 ์—์„œ ์ตœ์ข…์ ์œผ๋กœ ๋งˆ์ง€๋ง‰ ํ–‰์˜ ๋ฒˆํ˜ธ๊ฐ€ @rownum์— ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์‚ฌ์šฉํ•ด์ค˜์•ผ ํ•œ๋‹ค.

SET @rownum = -1; % ์„ธ๋ฏธ์ฝœ๋ก  ํ•„์ˆ˜
SELECT ROUND(AVG(lat_n), 4) AS median
FROM (SELECT @rownum := @rownum + 1 AS rnum, lat_n
      FROM station
      ORDER BY lat_n) AS stat
WHERE rnum IN (FLOOR(@rownum/2), CEIL(@rownum/2))

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ