ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 :: MySQL 5.7 Reference Manual :: 12.7 Date and Time Functions

    12.7 Date and Time Functions This section describes the functions that can be used to manipulate temporal values. See Section 11.2, “Date and Time Data Types”, for a description of the range of values each date and time type has and the valid formats

    dev.mysql.com

    MySQL DATE_FORMAT() Function (w3schools.com)

     

    MySQL DATE_FORMAT() Function

    W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

    www.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
Designed by Tistory.