Coding Diary.

(SQL) DATE_TRUNC DATE_PART 개념 및 연습문제 본문

Coding/SQL

(SQL) DATE_TRUNC DATE_PART 개념 및 연습문제

life-of-nomad 2024. 5. 13. 13:30
728x90
반응형

1) DATE_TRUNC

  • 날짜, 시간 열의 특정 부분으로 날짜를 자를 수 있습니다.
RESULT INPUT
2024-04-01 12:15:01 DATE_TRUNC('second', 2024-04-01 12:15:01)
2024-04-01 00:00:00 DATE_TRUNC('day', 2024-04-01 12:15:01)
2024-04-01 00:00:00 DATE_TRUNC('month', 2024-04-01 12:15:01)
2024-01-01 00:00:00 DATE_TRUNC('year', 2024-04-01 12:15:01)

 

2) DATE_PART

  • 하루 중 특정 부분만 빼내고 싶은 경우
  • dow : day of week, 0(일요일)~6(토요일) 사이의 값을 반환
RESULT INPUT
1 DATE_PART('second', 2024-04-01 12:15:01)
1 DATE_PART('day', 2024-04-01 12:15:01)
4 DATE_PART('month', 2024-04-01 12:15:01)
2024 DATE_PART('year', 2024-04-01 12:15:01)
  • 가장 많은 용지 묶음이 판매된 요일 구하기
SELECT DATE_PART('dow', occurred_at) AS day_of_week,
SUM(total) AS total_qty
FROM orders
GROUP BY 1
ORDER BY 2 DESC

=> 일요일(0)에 가장 많은 용지가 주문되었고, 목요일(4)에 가장 적은 용지가 주문된 걸 알 수 있습니다.

 

3) 연습문제

Schema

  • 각 'year'의 모든 주문에 대한 총 금액 기준으로 매출을 가장 큰 것에서 가장 적은 것 순으로 구합니다. 연간 총 판매액의 추세가 보입니까?
SELECT DATE_PART('year', occurred_at) ord_year, 
SUM(total_amt_usd) total_spent
FROM orders
GROUP BY 1
ORDER BY 2 DESC;

=> 연간 총계를 보면 2013년과 2017년의 총계가 다른 모든 연도보다 훨씬 적다는 것을 알 수 있습니다.

월 데이터를 자세히 살펴보면 '2013년'과 '2017년'의 경우 각 연도에 대해 한 달 동안의 판매 건만 있다는 것을 알 수 있습니다(2013년에는 12개, 2017년에는 1개).  2016년이 가장 큰 매출을 기록하면서 연 매출이 증가하고 있습니다. 이 속도로 2017년이 가장 큰 매출을 기록할 것으로 예상할 수 있습니다. 

=> 따라서 앞으로 나올 연습문제에 대해서 2013년과 2017년 매출을 제거해야 합니다.

 

 

  • Parch & Posey의 총 매출이 가장 높은 month는 언제입니까? 12월
SELECT DATE_PART('month', occurred_at) ord_month, 
SUM(total_amt_usd) total_spent
FROM orders
#2013, 2017년도 제거
WHERE occurred_at BETWEEN '2014-01-01' AND '2017-01-01' 
GROUP BY 1
ORDER BY 2 DESC;

 

  • Parch & Posey가 총 주문량 기준으로 가장 많이 팔린 year는 언제입니까?
SELECT DATE_PART('year', occurred_at) ord_year, SUM(total) total_spent
FROM orders
WHERE occurred_at BETWEEN '2014-01-01' AND '2017-01-01'
GROUP BY 1
ORDER BY 2 DESC;

  • Walmart가 달러 기준으로 gloss 에 가장 많이 지출한 year month는 언제입니까? 2016년 5월
SELECT DATE_TRUNC('month', o.occurred_at) ord_date,
SUM(o.gloss_amt_usd)
FROM orders o
JOIN accounts a
ON a.id = o.account_id
WHERE a.name = 'Walmart'
GROUP BY 1
ORDER BY 2 DESC 
LIMIT 1;

 

728x90
반응형