HackerRank/Oracle Occupations

[HackerRank/Oracle] Occupations

๐Ÿ“Œ๋ฌธ์ œ๋งํฌ ํ’€์ด์ฐธ๊ณ 

occupation ์—ด์„ pivotํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

1. DECODE/MIN ์ด์šฉ

DECODEํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ if else ์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•จ

DECODE(์ปฌ๋Ÿฝ, ์กฐ๊ฑด1, ๊ฒฐ๊ณผ1, ์กฐ๊ฑด2, ๊ฒฐ๊ณผ2)

1
2
3
4
5
6
7
8
9
10
SELECT  MIN(DECODE(OCCUPATION, 'Doctor',NAME)) Doctor,
        MIN(DECODE(OCCUPATION, 'Professor',NAME)) Professor,
        MIN(DECODE(OCCUPATION, 'Singer',NAME)) Singer,
        MIN(DECODE(OCCUPATION, 'Actor',NAME)) Actor
FROM    (
        SELECT OCCUPATION, NAME, ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) RN
        FROM OCCUPATIONS
        )
GROUP BY RN
ORDER BY 1,2,3,4;

2. PIVOT ์ด์šฉ

Oracle 11g ์ด์ƒ ๋ฒ„์ „์˜ ๊ฒฝ์šฐ PIVOTํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜์žˆ์Œ

1
2
3
4
5
6
7
8
9
10
11
12
SELECT  Doctor, Professor, Singer, Actor 
FROM (
    SELECT OCCUPATION, NAME, ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME)RN
    FROM OCCUPATIONS
)
PIVOT(
    MIN(NAME) FOR OCCUPATION IN ('Doctor' AS Doctor
                                 ,'Professor' AS Professor
                                 ,'Singer' AS Singer
                                 , 'Actor' AS Actor )
)
ORDER BY 1,2,3,4;

3. ์ถ”๊ฐ€๋กœ ์•Œ์•„์•ผ ํ•  ๊ฒƒ

์˜ค๋ผํด์—์„œ ๋ถ„์„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ• ๋•Œ PARTITION BY๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

GROUP BY๋ฅผ ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ , ์กฐํšŒ๋œ ๊ฐ ํ–‰์— ๊ทธ๋ฃน์œผ๋กœ ์ง‘๊ณ„๋œ ๊ฐ’์„ ํ‘œ์‹œ ํ• ๋•Œ OVER์ ˆ๊ณผ PARTITION BY ์ ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

๋ถ„์„ํ•จ์ˆ˜([์นผ๋Ÿผ]) OVER(PARTITION BY ์นผ๋Ÿผ1, ์นผ๋Ÿผ2... [ORDER BY ์ ˆ] [WINDOWING ์ ˆ])

์—ฌ๊ธฐ์„œ๋Š” ROW_NUMBER & OVER & PARTITION BY ๋ฅผ ์ด์šฉํ•ด ์ง์—…๋ณ„ ์ด๋ฆ„ ์ˆœ์œผ๋กœ ์ˆœ๋ฒˆ์„ ํ‘œ๊ธฐํ–ˆ๋‹ค.