sql

    [sql] 가중 이동평균

    https://indistract.tistory.com/60 [sql] 이동평균 주식시장에서는 기술적 분석을 할때 '이동평균선(moving average)'를 기본적인 도구로 사용한다. 이동평균선은 최근 N일치의 평균가격을 구한 값으로 주가 흐름을 파악하기 위해 사용된다. 아래 사 indistract.tistory.com 우리는 데이터를 바라볼때, 모든 기간의 데이터에 대하여 균등한 무게를 두고 분석하지는 않는다. 예를들어, 장염에 걸린 환자가 병원에 찾아간다면 의사는 환자가 '어제' 어떤 음식을 먹었는지 궁금해하며, '1년전'에 어떤 음식을 먹었는지 물어보지는 않을 것이다. 이처럼 최신의 데이터일수록 좀더 중요성을 부여해야할 경우가 종종있다. 그리고 이를 적용한 개념중 하나가 '가중 이동평균' 이다. ..

    [sql] 이동평균

    주식시장에서는 기술적 분석을 할때 '이동평균선(moving average)'를 기본적인 도구로 사용한다. 이동평균선은 최근 N일치의 평균가격을 구한 값으로 주가 흐름을 파악하기 위해 사용된다. 아래 사진을 보면 차례대로 5일, 20일, 60일, 그리고 120일 이동평균선이 표기되어있다. 이는 각 일자의 최근 N일 동안의 평균주가를 이어놓은 선이라고 보면 되겠다. 예를들어, 5일 이동평균선은 '5일간의 종가 합계 / 5일' 로 계산하며, 이 평균 주가를 이어놓은 선이 '5일 이동 평균선'이다. sql에서도 윈도우함수(window function)을 이용하면 위와 같은 이동평균을 구할수 있다. 실습 테이블은 주가 테이블 대신 매출테이블을 이용한다. 먼저, 이동평균 매출을 구하기전에 아래와같이 월별 총 매출을..

    [sql] 테이블 관계를 고려한 aggregation

    https://indistract.tistory.com/58 [sql] 월 전체 매출액 대비 비율 아래 4가지 테이블을 이용해서 월별 상품 카테고리별 구매건수와 매출을 구한뒤, 월별로 각 카테고리가 얼만큼의 매출 비중을 차지하는지 구해보려한다. ① nw.order: 주문정보 테이블 ② nw.order_it indistract.tistory.com 앞선 게시글에서는 월내 카테고리별 매출액 대비 비율을 구해봤다. 이번에는 비슷하게 카테고리내 상품별 매출액 대비 비율을 구하며, 추가적으로 각 카테고리내 상품의 매출액 순위가지 구해보려한다. 각 행의 순위를 구하려면 row_number() 함수를 사용해주면된다. 그리고 어떤 기준으로 partiton하고, 어떤 기준으로 순위를 매길것인지에 대한 정보는 over(p..

    [sql] 월 전체 매출액 대비 비율

    아래 4가지 테이블을 이용해서 월별 상품 카테고리별 구매건수와 매출을 구한뒤, 월별로 각 카테고리가 얼만큼의 매출 비중을 차지하는지 구해보려한다. ① nw.order: 주문정보 테이블 ② nw.order_items: 주문상품 테이블 ③ nw.products: 상품정보 테이블 ④ nw.category: 상품카테고리정보 테이블 먼저 아래와 같이 각 테이블에서 정보를 가져울수 있도록 키값에 맞춰 테이블을 연결해주고, ① 주문정보 테이블에서 일자를, ④ 카테고리 정보 테이블에서 카테고리 명을, 그리고 ② 주문상품 테이블에서 order_id의 유일값 개수와 총 매출액을 구해주면 월별/카테고리별 주문건수와 매출액을 구할수 있다. * 하나의 주문에서 여러 상품을 구입할수 있으므로, 주문번호 고윳값 갯수를 주문건수로 ..

    [sql] date_trunc

    postgres에는 date_trunc라는 함수가 있는데, 이 함수를 이용하면 년/월/주/일 별 구매건수와 매출액을 구하는데 용이하다. nw.orders 라는 주문정보 테이블에 'order_date'라는 주문일자 칼럼이 있다고 해보자. select date_trunc('day', order_date) from nw.orders; 이때 위 쿼리처럼 date_trunc('day', order_date) 함수를 써주면, order_date의 시분초 단위는 절삭하여 일(day) 단위의 timestamp를 출력해준다. date_trunc 함수를 사용하여 일단위로 절삭했으므로 사실 시분초 단위는 필요없다. 그래서 출력된 timestamp 형식의 데이터를 아래처럼 date 형식으로 변환해주면 좀더 깔끔하게 데이터를 ..

    [SQL] Aggregation Without Grouping

    SQL에는 여러가지 집계함수가 있다. 집계함수는 그룹별로 값을 집계해준다. 이를 이용하면 회사 부서별로 평균 임금을 구해볼 수도있고, 학교 반별로 최소 성적을 구해볼수도 있다. 그룹별로 집계를 하기 위해서는 쿼리를 아래와 같이 작성한다. group_name에서는 그룹화를 원하는 테이블의 필드가 들어간다. 그리고 value에는 집계를 원하는 값을 넣어주면 된다. 예시에는 그룹별 합(SUM)을 예시로 들었지만, SUM 대신 MIN이나 MAX, AVG 등도 사용할 수 있다. SELECT group_name, SUM(value) FROM table GROUP BY group_name; 일반적으로는 위의 형태를 사용하지만, 집계함수는 GROUP BY문 없이도 사용할 수 있다. 그룹없이 어떻게 집계를 하냐고 할수도..

    [SQL][HackerRank] The Blunder

    https://www.hackerrank.com/challenges/the-blunder/problem?isFullScreen=true The Blunder | HackerRank Query the amount of error in Sam's result, rounded up to the next integer. www.hackerrank.com Samantha was tasked with calculating the average monthly salaries for all employees in the EMPLOYEES table, but did not realize her keyboard's key was broken until after completing the calculation. She w..

    [SQL][HackerRank] Binary Tree Nodes

    https://www.hackerrank.com/challenges/binary-search-tree-1/problem?isFullScreen=true Binary Tree Nodes | HackerRank Write a query to find the node type of BST ordered by the value of the node. www.hackerrank.com You are given a table, BST, containing two columns: N and P, where N represents the value of a node in Binary Tree, and P is the parent of N. 문제에서는 N칼럼과 P칼럼으로 이루어진 BST라는 테이블이 주어진다. N은 각 ..