Coding Test/SQL

๋ณดํ˜ธ ๊ธฐ๊ฐ„์ด ๊ฐ€์žฅ ๊ธธ์—ˆ๋˜ ๋™๋ฌผ (SQL ๋ฌธ์ œ ํ’€์ด)

_data 2025. 4. 15. 22:42

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

๐Ÿ“Œ ๋ฌธ์ œ ๊ฐœ์š”

๋™๋ฌผ ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๋™๋ฌผ(ANIMAL_INS)๊ณผ ์ž…์–‘์„ ๊ฐ„ ๋™๋ฌผ(ANIMAL_OUTS)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ,
์ž…์–‘๋œ ๋™๋ฌผ ์ค‘ ๋ณดํ˜ธ์†Œ์— ๊ฐ€์žฅ ์˜ค๋ž˜ ๋จธ๋ฌธ ๋™๋ฌผ 2๋งˆ๋ฆฌ์˜ ID์™€ ์ด๋ฆ„์„ ์กฐํšŒํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

๋ณดํ˜ธ ๊ธฐ๊ฐ„์€ ์ž…์–‘์ผ - ์ž…์†Œ์ผ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉฐ, ๋ณดํ˜ธ ๊ธฐ๊ฐ„์ด ๊ธด ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

 

๐Ÿ—‚๏ธ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

ANIMAL_INS

์ปฌ๋Ÿผ๋ช…ํƒ€์ž…์„ค๋ช…
ANIMAL_ID VARCHAR(N) ๋™๋ฌผ์˜ ID (๊ธฐ๋ณธํ‚ค)
ANIMAL_TYPE VARCHAR(N) ๋™๋ฌผ ์ข…
DATETIME DATETIME ๋ณดํ˜ธ ์‹œ์ž‘์ผ
INTAKE_CONDITION VARCHAR(N) ์ž…์†Œ ์ƒํƒœ
NAME VARCHAR(N) ์ด๋ฆ„ (nullable)
SEX_UPON_INTAKE VARCHAR(N) ์„ฑ๋ณ„ ๋ฐ ์ค‘์„ฑํ™” ์—ฌ๋ถ€

ANIMAL_OUTS

์ปฌ๋Ÿผ๋ช…ํƒ€์ž…์„ค๋ช…
ANIMAL_ID VARCHAR(N) ๋™๋ฌผ์˜ ID (์™ธ๋ž˜ํ‚ค)
ANIMAL_TYPE VARCHAR(N) ๋™๋ฌผ ์ข…
DATETIME DATETIME ์ž…์–‘์ผ
NAME VARCHAR(N) ์ด๋ฆ„ (nullable)
SEX_UPON_OUTCOME VARCHAR(N) ์„ฑ๋ณ„ ๋ฐ ์ค‘์„ฑํ™” ์—ฌ๋ถ€

โœ… ๋ฌธ์ œ ์š”๊ตฌ์‚ฌํ•ญ

  • ๋ณดํ˜ธ ๊ธฐ๊ฐ„์ด ๊ฐ€์žฅ ๊ธด ๋™๋ฌผ 2๋งˆ๋ฆฌ๋งŒ ์กฐํšŒ
  • ์ถœ๋ ฅ ์ปฌ๋Ÿผ์€ ANIMAL_ID, NAME
  • ๋ณดํ˜ธ ๊ธฐ๊ฐ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์•„๋ฌด ๊ธฐ์ค€ ์—†์ด ์ถœ๋ ฅ ๊ฐ€๋Šฅ
  • ๊ฒฐ๊ณผ๋Š” ๋ณดํ˜ธ ๊ธฐ๊ฐ„์ด ๊ธด ์ˆœ์œผ๋กœ ์ •๋ ฌ

๐Ÿงพ ๋‚ด๊ฐ€ ์ฒ˜์Œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

SELECT ins.ANIMAL_ID, ins.NAME
FROM ANIMAL_INS ins
JOIN (
    SELECT i.ANIMAL_ID, i.NAME, DATEDIFF(o.DATETIME, i.DATETIME) AS day_diff
    FROM ANIMAL_INS i
    JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
    ORDER BY day_diff DESC
    LIMIT 2
) n ON n.ANIMAL_ID = ins.ANIMAL_ID;
 

โš ๏ธ ๊ฐœ์„  ํฌ์ธํŠธ

  • ANIMAL_INS๋ฅผ ์„œ๋ธŒ์ฟผ๋ฆฌ ์•ˆ๊ณผ ๋ฐ–์—์„œ ๋‘ ๋ฒˆ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์‚ฌ์šฉ
  • ์ด๋ฏธ ํ•„์š”ํ•œ ์ปฌ๋Ÿผ์ด ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ๋‹ค ๋‚˜์˜ค๋Š”๋ฐ๋„ ๋‹ค์‹œ ์กฐ์ธํ•จ
  • day_diff๋Š” ORDER BY์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๊ตณ์ด AS๋กœ ํ‘œํ˜„ํ•  ํ•„์š” ์—†์Œ

๐Ÿ’ป ์ตœ์ข… SQL

 
SELECT i.ANIMAL_ID, i.NAME
FROM ANIMAL_INS i
JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
ORDER BY DATEDIFF(o.DATETIME, i.DATETIME) DESC
LIMIT 2;

 

๐Ÿงพ ์ถœ๋ ฅ ์˜ˆ์‹œ

ANIMAL_IDNAME
A362707 Girly Girl
A370507 Emily

โœ๏ธ ์ •๋ฆฌ

์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ๋ฐฐ์šด ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. DATEDIFF ํ•จ์ˆ˜๋Š” ๋‘ ๋‚ ์งœ์˜ ์ผ ์ˆ˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • DATEDIFF(์ž…์–‘์ผ, ์ž…์†Œ์ผ)์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ
  2. ํ‘œํ˜„๋งŒ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ปฌ๋Ÿผ์€ ORDER BY์— ์ง์ ‘ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
    • ๊ผญ AS๋กœ ๋ณ„์นญ์„ ์ค„ ํ•„์š”๋Š” ์—†๋‹ค
  3. ๋ถˆํ•„์š”ํ•œ ์กฐ์ธ๊ณผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ํ”ผํ•˜์ž.
    • ํ•„์š”ํ•œ ์ปฌ๋Ÿผ์ด ์žˆ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์กฐ์ธํ•œ ๊ฒฐ๊ณผ์—์„œ ์ •๋ ฌ๊ณผ ์ œํ•œ์„ ๋ฐ”๋กœ ์ฃผ๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค

์ถ”๊ฐ€๋กœ LIMIT์„ ํ™œ์šฉํ•ด์„œ ์›ํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒ ๋ฝ‘๋Š” ๋ฐฉ๋ฒ•๋„ ๋ณต์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ ,
๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ์—” ์ด๋Ÿฐ ์กฐ์ธ์˜ ํšจ์œจ์„ฑ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.