-
SQL 문제 - 상위n개문제풀이/SQL 2024. 3. 27. 15:42
동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.
코딩테스트 연습 - 상위 n개 레코드 | 프로그래머스 스쿨 (programmers.co.kr)
더보기-- 코드를 입력하세요 -- 1. 열에 번호를 부여하여 where 로 1번 찾기 -rownum -- 2. 특정 명령어 top n, top %, limit -- 3. 연산 가능한 숫자를 이용하여 연산자를 통해 -- group 으로 묶고 이를 subquery로 만든 뒤 이름만 추출 select name from (select 시기,sum (년), name, 년 from (SELECT DATE_FORMAT(datetime, '%Y/%m/%d') '시기' ,name, date_format(date(datetime), '%y') '년' from animal_ins order by 1)a)b
3번 문제점
subquery 로 묶는다면, orderby를 통해 재정렬된 순서를 기준으로
기존과는 다른 기준을 가지고서 연산 될 것이라 생각하였으나
원래의 함수의 첫번째 있는 시간상의 우선권을 가진 데이터가 아닌,
기존 animal_id 기준으로 다시 재배열 되었음을 알게 됨.
+ 2중 subquery 지정은 가능하나 피해야 할 화살촉 모양이 됨
장기적 관리 및 수정이 어려움.
순위권 중 n개의 항을 뽑기 위해선
파이썬이라면 list 에 순서를 부여하는 enumerate 를 이용하여 n번째까지 표현 후 break
//불러온 자료가 tuple이라면? list로 전환할 수 있는가?
새로운 명렁어를 배워야 할 것 같다.
select name from (select animal_id, animal_type, datetime, intake_condition, name,SEX_UPON_INTAKE, DATE_FORMAT(datetime, '%Y%m%d') '시기' from animal_ins order by 7 asc)a limit 1
왜 불가능한지 모르겠다.
아마 subquery를 사용하지 말라는 듯 하다.
where 문을 이용한 해결 방식이 있다.
select name from animal_ins where datetime = (select min(datetime) from animal_ins)
MSSQL - SELECT TOP
더보기SELECT TOP 3 * FROM TABLE ORDER BY SALARY DESC
SELECT TOP(5) ename , job , sal FROM emp
SELECT TOP 50 PERCENT * FROM TABLE ORDER BY SALARY DESC
왜인지는 모르겠으나 괄호를 붙여도, *을 사용해도, 제거해도
프로그래머스 코드실행은 물론 dbeaver에서도 사용이 불가능했다.
확인 할 것.
MYSQL - LIMIT절
ㅇㄹㄴㅇㅁㄹㄴㅇㅁ
SELECT * FROM TABLE ORDER BY SALARY DESC LIMIT 3 --(LIMIT 0,3 과 똑같습니다)
정상적으로 작동하여 이를 통해 해결하였다.
MYSQL - ROW_NUMBER절
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum , ename , job , sal FROM emp WHERE sal > 2000
SELECT ROW_NUMBER() OVER(PARTITION BY job ORDER BY job, sal DESC) AS rownum , ename , job , sal FROM emp WHERE sal > 2000
order by 기준과 상관없이 자료상의 1번 행에 있는 자료부터 1번으로 매겨져 특정 항목에 대해 적용하긴 어려웠다.
날짜 명령어 모음
더보기Format Description
%a Abbreviated weekday name (Sun to Sat) 요일 명을 Sun to Sat 으로 %b Abbreviated month name (Jan to Dec) 월 별 이름을 Jan to Dec 으로 %c Numeric month name (0 to 12) 월 별 이름을 0 ~12 로 %D Day of the month as a numeric value, followed by suffix (1st, 2nd, 3rd, ...) 일 이름을 1st, 2nd,... 으로 %d Day of the month as a numeric value (01 to 31) %e Day of the month as a numeric value (0 to 31) %f Microseconds (000000 to 999999) %H Hour (00 to 23) %h Hour (00 to 12) %I Hour (00 to 12) %i Minutes (00 to 59) %j Day of the year (001 to 366) %k Hour (0 to 23) 24시간 표기법으로 %l Hour (1 to 12) 12시간 표기법으로 %M Month name in full (January to December) 달 이름을 Full Name으로 %m Month name as a numeric value (00 to 12) 달 이름을 00~12 숫자로 %p AM or PM PM, AM 표시 %r Time in 12 hour AM or PM format (hh:mm:ss AM/PM) %S Seconds (00 to 59) %s Seconds (00 to 59) %T Time in 24 hour format (hh:mm:ss) 24시간 표기법으로 %U Week where Sunday is the first day of the week (00 to 53) %u Week where Monday is the first day of the week (00 to 53) %V Week where Sunday is the first day of the week (01 to 53). Used with %X %v Week where Monday is the first day of the week (01 to 53). Used with %x %W Weekday name in full (Sunday to Saturday) 요일 이름을 Full Name으로 %w Day of the week where Sunday=0 and Saturday=6 Sunday=0~Saturday=6 으로 %X Year for the week where Sunday is the first day of the week. Used with %V 일주일의 시작을 일요일 %x Year for the week where Monday is the first day of the week. Used with %v 일주일의 시작을 월요일 %Y Year as a numeric, 4-digit value 년도 표현 4자리로 %y Year as a numeric, 2-digit value 년도 표현 2자리로 출처: https://bramhyun.tistory.com/28 [日日新又日新:티스토리]
MySQL :: MySQL 5.7 Reference Manual :: 12.7 Date and Time Functions
MySQL DATE_FORMAT() Function (w3schools.com)
'문제풀이 > SQL' 카테고리의 다른 글
SQL - 가격'대'별 구분 (0) 2024.04.09 SQL - 문제 (0) 2024.04.03 SQL - 날짜조회(범위) (0) 2024.04.02 SQL 문제풀이 -3 (0) 2024.04.01 SQL 문제 풀이 - 2일차 (1) 2024.03.29