본문 바로가기

SQL71

[PostgreSQL] 매출을 파악하기 위한 데이터 추출1 데이터 확인 1. 날짜별 매출 집계 시간의 흐름에 따라 일자별로 총 매출, 구매 횟수, 평균 매출을 구한다 SELECT dt , COUNT(*) AS purchase_cnt , SUM(purchase_amount) AS total_amount , AVG(purchase_amount) as avg_amount FROM purchase_log group by dt order by dt 2. 이동평균을 사용한 날짜별 추이 날짜별 매출을 위에서 구했는데, 이를 시각화한 결과에 주기성이 나타난다면 이동평균을 확인해본다. 날짜별 매출과 7일 이동평균을 집계해본다. 이때 날짜별로 변동을 파악하는 것도 중요하므로 날짜별 추이와 이동평균을 함께 표현하는 것이 좋다. seven_day_avg : 단순히 현재 날짜로부터 7.. 2024. 1. 26.
[SQL] 데이터의 종류 트랜젝션 데이터 서비스와 시스템을 통해 사용자의 행동을 기록한 데이터 : 구매 데이터, 리뷰 데이터, 게임 플레이 데이터 등 날짜, 시각, 마스터 데이터의 회원 ID, 상품 ID, 수량, 가격 등이 포함되는 경우가 많음 사용자 또는 운용 상의 이유로 변경되거나 제거될 수 있음 👉 트랜젝션 데이터를 기반으로 리포트를 만드는 경우가 많다. (단, 마스터 데이터가 필요함) 마스터 데이터 서비스와 시스템이 정의하고 있는 데이터 : 카테고리 마스터, 상품 마스터, 회원과 관련된 정보 등 트랜젝션 데이터와 마스터 데이터를 결합해서 리포트 업무의 폭을 넓힘(상품 이름, 카테고리, 발매일 까지 확인) 로그 데이터 누적형 데이터라는 점이 포인트 : 출력 시점의 정보를 축적해두는 것 로그 출력 이후에 가격이 변경되거나 사.. 2024. 1. 25.
[HackerRank] Interviews (Advanced Join) 풀이 Advanced Join / Hard 문제 ✨ 문제 링크 : https://www.hackerrank.com/challenges/interviews/problem?isFullScreen=true contest_id, hacker_id, name 별로 다음 컬럼의 합계를 구해야한다. sums of total_submissions & total_accepted_submissions & total_views & total_unique_views for each contest 👉 주어진 컬럼 자체를 JOIN 하지 않고, 서브쿼리로 합계 컬럼을 각각 가공한 후 해당 테이블을 JOIN 하는 방법을 사용하여 해결한다. 풀이 1. contest_id, hacker_id, name 컬럼이 들어있는 Contest 테이블을.. 2024. 1. 17.
[HackerRank] Occupations (Pivot) Advanced Select / Medium Level 문제 ✨ 문제링크 : https://www.hackerrank.com/challenges/occupations/problem?isFullScreen=true 다음과 같은 테이블을 피봇 하여, Doctor, Professor, Singer, and Actor 컬럼 순으로 해당 직업에 해당하는 사람 이름이 알파벳 순으로 정렬되게 만들어야 한다. 풀이 1. 테이블 확인 먼저 테이블은 위 예시와 동일하게 이름/직업 순으로 되어 있다. SELECT * FROM OCCUPATIONS 2. 직업별로 이름을 알파벳 순으로 정렬하고 번호 매기기 문제 조건 중 직업별로 피봇 하되, 알파벳 순으로 이름을 정렬하는 점이 있다. 그리고 피봇 결과는 1, 2, 3행 별로 위.. 2024. 1. 17.
[HackerRank] SQL Project Planning Advanced Join / Intermediate 문제 👉 문제 링크 : https://www.hackerrank.com/challenges/sql-projects/problem?isFullScreen=true 다음과 같은 테이블에서 end_date와 start_date가 연속적으로 이어지면 하나의 프로젝트로 간주한다. Start_Date 고윳값은 Start_date가 End_Date와 일치하지 않는 것이며, End_Date 고윳값 역시, Start_date와 일치하지 않으면 하나의 프로젝트의 시작일과 종료일이 된다. 이 포인트로 문제를 풀면 아래와 같다 풀이 FROM 절에 두 개의 서브쿼리를 넣는다. 각각 프로젝트별 고유한 시작일과 종료일을 추출하는 것이다. WHERE 절에 시작일이 종료일에 포함되지.. 2024. 1. 17.
[HackerRank] Contest Leaderboard Basic Join / Intermediate 문제 hacker_id, name, 총 점수를 쿼리 총 점수는 challenge_id 별로 가장 높은 값을 합산 한 것(해커별로) 총 점수 기준으로 내림차순 후, 동일한 점수라면 hacker_id 기준으로 정렬 단, 총 점수가 0인 해커는 제외 풀이 FROM 절에 서브쿼리 : 먼저 hacker_id, challenge_id 별로 가장 높은 점수를 얻어내고 그 값을 합산해야한다. Submission 테이블만 사용하며, hacker_id, challenge_id 기준으로 Groupby MAX(score) 값 도출 위의 서브쿼리와 Hackers 테이블을 JOIN SELECT 절에 도출이 필요한 컬럼 hacker_id, name, SUM(max_score)를 나열 .. 2024. 1. 16.
[HackerRank] Challenges Basic Join / Intermediate 문제 hacker_id, name, 도전과제 총 수 출력 결과는 도전과제 총 수(내림차순), 도전과제 총 수가 동일하면 hacker_id로 추가 정렬 단, 도전과제 수가 동일하고, 그 수가 최대 도전과제 수보다 작은 경우 해당 학생은 결과에서 제외 풀이 이 문제의 핵심은 세 번째 조건이며 FROM 절에 서브쿼리를 사용하여 해결한다. 먼저 해커아이디/이름 기준으로 groupby 하여 challenge_id를 count()하여 totalcount를 구한다 다음으로 세번째 조건을 필터링 하기 위해 총 도전과제 수의 중복 수와 전체 도전과제 수 중 최댓값을 구해야한다 도전과제 중복수 : COUNT(challenge_id) 별로 몇 번이나 값이 나왔는지(중복되었는지).. 2024. 1. 16.
[HackerRank] The Report (INNER JOIN - BETWEEN) 문제 다음과 같이 Students, Grades 두 테이블이 주어졌다. 문제는 다음과 같은 순으로 해결한다. 1. 세 개의 열 : 이름, 학년 및 점수 2. 학점이 8 미만인 학생들의 이름은 제외 >> NULL 3. 학점을 내림차순으로 정렬 (높은 학점이 먼저 표시됨) 4. 학점이 8에서 10 사이인 학생들이 여러 명인 경우, 이름을 알파벳 순으로 정렬 - 5. 학점이 8 미만인 학생들의 경우, 이름을 "NULL"로 표시하고 학점을 내림차순으로 정렬 6. 학점이 1에서 7 사이인 학생들이 여러 명인 경우, 점수를 오름차순으로 정렬 풀이 ▶︎ 이 문제의 핵심은 두 테이블을 join 할 때 inner join + between을 사용해서 mark의 최대 최솟값과 grade를 매치시키는 것이다. ▶︎ Case.. 2024. 1. 15.
[HackerRank] Weather Observation Station 5(UNION) 문제 ▶︎ 도시명이 가장 긴 것과, 짧은 것을 하나씩 도출(알파벳 순으로 정렬하여 가장 처음 값만 반환) 풀이 ▶︎ UNION을 사용하여 가장 긴 값과 짧은 값을 각각 구한다. ▶︎ 문자열의 길이는 LENGTH()함수를 사용한다. (SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY 2 ASC, 1 ASC LIMIT 1) UNION (SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY 2 DESC, 1 ASC LIMIT 1) 2024. 1. 15.
728x90