일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- MySQL
- GRU
- HackerRank
- 논문리뷰
- SQL 날짜 데이터
- 자연어처리
- 카이제곱분포
- inner join
- 코딩테스트
- 서브쿼리
- sql
- 자연어 논문
- LSTM
- torch
- CASE
- 그룹바이
- nlp논문
- 짝수
- sigmoid
- Statistics
- Window Function
- airflow
- 자연어 논문 리뷰
- 표준편차
- update
- SQL코테
- NLP
- leetcode
- t분포
- 설명의무
- Today
- Total
HAZEL
[ SQL : 날짜 빼기, TIMESTAMPDIFF, DATEDIFF] 프로그래머스 오랜 기간 보호한 동물(2) 본문
[ SQL : 날짜 빼기, TIMESTAMPDIFF, DATEDIFF] 프로그래머스 오랜 기간 보호한 동물(2)
Rmsid01 2021. 10. 16. 23:55프로그래머스 오랜 기간 보호한 동물(2)
>> 문제
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다. 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.
>> 정답 코드
: 아래에서는 TIMESTAMPDIFF의 개념과 서브쿼리를 이용하여 문제를 풀었다.
SELECT ad.ANIMAL_ID, ad.NAME
FROM (SELECT ins.ANIMAL_ID, ins.NAME, TIMESTAMPDIFF(day, ins.DATETIME, outs.DATETIME ) as diff
FROM ANIMAL_INS ins
LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
ORDER BY diff DESC
LIMIT 2) ad
사용된 개념 : TIMESTAMPDIFF
>> 다른사람이 푼 코드
: DATE, TIME 관련 함수를 사용하지 않고 단순히 - 을 이용하였다. 또한, ORDER BY 절에 넣음으로써, 서브쿼리를 이용하지 않았다.
: 물론, ORDER BY 절에 위의 DATE관련 함수를 사용해서 빼도 가능하다. ORDER BY 에 바로 사용할 수 있다는 점을 생각하면 좋을 것같다.
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_INS INS RIGHT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY OUTS.DATETIME - INS.DATETIME DESC
LIMIT 2;
날짜의 차이를 나타내는 방법
: 날짜의 차이를 방법으로는 여러가지가 존재한다.
1) TIMEDIFF( 시간1, 시간2 )
: 원하는 데이터타입의 시간을 넣어준다. 시간1 - 시간2 로 데이터의 계산이 진행된다.
SELECT ins.ANIMAL_ID, ins.NAME, TIMEDIFF(outs.DATETIME, ins.DATETIME)
FROM ANIMAL_INS ins
LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
LIMIT 4
2) DATEDIFF( 날짜1, 날짜2 )
: 원하는 데이터의 타입의 '날짜'를 넣어준다. 날짜1 - 날짜 2 로 계산이 진행된다.
아래의 데이터를 보면 위의 TIMEDIFF와의 차이점을 볼수 있다. 위에는 시간의 뺄셈이 나오고, 아래는 날짜(일)의 차이가 나온다.
SELECT ins.ANIMAL_ID, ins.NAME, DATEDIFF(outs.DATETIME, ins.DATETIME)
FROM ANIMAL_INS ins
LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
LIMIT 4
3) TIMESTAMPDIFF( '결과값 형식'. '날짜1'. '날짜2')
: 이 함수는 모든 시간에 대한 차이를 계산하는 함수이다. 위에서 언급한 2개와는 다르게, 내부적으로 계산하는 순서가 다르다. '날짜2' - '날짜1' 로 내부적으로 계산된다.
- DATE_FORMAT을 넣어준 이유는, 데이터타입이 아닐경우 타입을 맞춰주기 위해서 넣어준다.
SELECT ins.ANIMAL_ID, ins.NAME, TIMESTAMPDIFF(day, DATE_FORMAT(ins.DATETIME,"%Y-%m-%d"), DATE_FORMAT(outs.DATETIME,"%Y-%m-%d")) TIMESTAMPDIFF
FROM ANIMAL_INS ins
LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
LIMIT 4
- 결괏값 형식이란 뺄셈을 한 결과에 대해 원하는 단위를 입력하면 된다.
- SECOND : 초
- MINUTE : 분
- HOUR : 시
- DAY : 일
- WEEK : 주
- MONTH : 월
- QUARTER : 분기
- YEAR : 연
'DATA ANALYSIS > SQL' 카테고리의 다른 글
[ SQL : 사용자 정의 함수(DECLARE, SET), CASE , IF, LIMIT 심화 ] 177. Nth Highest Salary (0) | 2021.11.12 |
---|---|
[ SQL : LENGTH ] hackerrank : Weather Observation Station 5 (0) | 2021.10.25 |
[ SQL : 사용자 정의 함수, User - defined Function ] (0) | 2021.05.17 |
[SQL : 정규표현식 ] HackerRank : Weather Observation Station 7 / 8 (0) | 2021.05.16 |
[SQL : 정규표현식 ] HackerRank : Weather Observation Station 6 / 9 (0) | 2021.05.15 |