- 큐
- regexp
- 이진트리
- Article & User
- Tree
- 뷰
- Vue
- update
- Django
- stack
- M:N
- 백트래킹
- SQL
- 트리
- 통계학
- DB
- 완전검색
- 스택
- N:1
- distinct
- migrations
- 그리디
- 쟝고
- Queue
- outer join
- drf
- count
- create
- ORM
- delete
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
목록2025/01 (31)
데이터 분석 기술 블로그

SELECT s.user_id, ROUND(IFNULL(SUM(CASE WHEN c.action = 'confirmed' THEN 1 ELSE 0 END) / COUNT(c.user_id), 0), 2) AS confirmation_rateFROM Signups sLEFT JOIN Confirmations cON s.user_id = c.user_idGROUP BY s.user_id;JOIN을 사용하지 않으면 Signups에 있는 user_id가 반영이 안 된다.IFNULL을 사용해서 NULL일 때 0이라는 조건을 넣지 않으면 Confirmations 테이블에 없는 user_id에는 confirmation_rate가 NULL로 나타난다. 우리는 0이 필요하므로 IFNULL을 사용했다.

SELECT customer_idFROM CustomerGROUP BY customer_idHAVING COUNT(DISTINCT(product_key)) = (SELECT COUNT(product_key) FROM Product);문제 분석: 고객별로 구매한 고유 제품 수를 전체 제품 수와 비교해야 함.구현 접근:고객별로 데이터를 그룹화(GROUP BY customer_id).고유 제품 수 계산(COUNT(DISTINCT product_key)).전체 제품 수 비교 → HAVING 절 사용 필요.실수:집계 함수 조건에 HAVING 대신 WHERE를 사용하려 했음.개선 방향집계 함수 조건을 처리해야 할 때는 항상 HAVING을 고려.GROUP BY → COUNT → HAVING의 흐름을 연습.

SELECT DISTINCT(l1.num) AS ConsecutiveNumsFROM Logs l1JOIN Logs l2 ON l1.id = l2.id - 1JOIN Logs l3 ON l1.id = l3.id - 2WHERE l1.num = l2.num AND l2.num = l3.num;ConsecutiveNums만 구하면 되는 거니까 만약에 1 1 1 2 1 1 1이어도 1이 두 번 Output에 나올 필요는 없다. 따라서 DISTINCT(l1.num)으로 구하면 된다.

SELECT product_id, year AS first_year, quantity, priceFROM SalesWHERE (product_id, year) IN (SELECT product_id, MIN(year) FROM Sales GROUP BY product_id);

SELECT ROUND(AVG(order_date = customer_pref_delivery_date) * 100, 2) AS immediate_percentageFROM DeliveryWHERE (customer_id, order_date) in ( SELECT customer_id, min(order_date) FROM delivery GROUP BY customer_id);AVG(condition) 활용법:SQL에서 조건식(condition)을 AVG()에 넣으면, 조건이 참인 행들의 비율을 계산할 수 있다.예: AVG(order_date = customer_pref_delivery_date)는 조건이 참인 경우 1로 간주하고, 평균을 계산하여 비율을 반환.WHERE (column..

SELECT ROUND(COUNT(DISTINCT(player_id)) / (SELECT COUNT(DISTINCT(player_id)) FROM Activity), 2) AS fractionFROM ActivityWHERE (player_id, DATE_SUB(event_date, INTERVAL 1 DAY)) IN ( SELECT player_id, MIN(event_date) FROM Activity GROUP BY player_id);WITH를 사용한 단계적 접근:첫 로그인 날짜 계산(FirstLogin)과 첫 로그인 다음 날 확인(NextDayLogin)을 별도 CTE로 분리하면 가독성과 디버깅이 쉬움.JOIN을 활용한 비교:JOIN을 사용하여 player_id와 첫 로그인 다음..

SELECT SUBSTR(trans_date, 1, 7) AS month, country, COUNT(id) AS trans_count, SUM(CASE WHEN state='approved' THEN 1 ELSE 0 END) AS approved_count, SUM(amount) AS trans_total_amount, SUM(CASE WHEN state='approved' THEN amount ELSE 0 END) AS approved_total_amountFROM TransactionsGROUP BY month, country; SELECT에서 필터링한 것도 GROUP BY에서 사용할 수 있는 것을 몰랐다.