01. 작성 쿼리
SELECT *
FROM wines
WHERE color = 'white'
AND quality >= 7
AND density > (SELECT AVG(density) FROM wines)
AND residual_sugar > (SELECT AVG(residual_sugar) FROM wines)
AND pH < (SELECT AVG(pH) FROM wines WHERE color = 'white' )
AND citric_acid > (SELECT AVG(citric_acid) FROM wines WHERE color = 'white' )
02. 쿼리 결과

03. 다른 풀이 방법
지금 풀이는 같은 테이블을 여러 번 스캔해야하기 때문에 데이터가클 경우 성능이 저하될 가능성이 높고,
유지보수 시 평균 조건 수정이 번거롭습니다
그래서 CTE를 이용해서 조건이 잘 보이고, 수정도 쉽게 작성하면 아래와 같습니다.
WITH avg_all AS (
SELECT
AVG(density) AS avg_density,
AVG(residual_sugar) AS avg_residual_sugar
FROM wines
),
avg_white AS (
SELECT
AVG(pH) AS avg_pH,
AVG(citric_acid) AS avg_citric_acid
FROM wines
WHERE color = 'white'
)
SELECT *
FROM wines w
CROSS JOIN avg_all a
CROSS JOIN avg_white aw
WHERE w.color = 'white'
AND w.quality >= 7
AND w.density > a.avg_density
AND w.residual_sugar > a.avg_residual_sugar
AND w.pH < aw.avg_pH
AND w.citric_acid > aw.avg_citric_acid;
CROSS JOIN을 사용한 이유
CROSS JOIN은 두 테이블의 "행(row)수"를 기준으로 가능한 모든 조합을 만드는 JOIN입니다
그렇기 때문에 CROSS JOIN을 사용해 평균 기준값을 모든 와인 행에 적용한겁니다
위에 쿼리에서 사용한 avg_all, avg_white 같은 with절에서 생성된 테이블은
개별와인을 식별하거나 특정 wine 행과 1:1로 매칭하기 위한 용도가 아닙니다.
그냥 모든 행에 동일하게 적용할 기준값이죠
그래서 원본 테이블의 모든 행에 그대로 붙여 비교하는 것이 핵심입니다
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [solvesql]Advent of SQL 2025 9일차 (0) | 2025.12.14 |
|---|---|
| (solvesql)Advent of SQL 2025 7일차 (0) | 2025.12.08 |
| (solvesql) Advent of SQL 2025 6일차 (0) | 2025.12.08 |
| (solvesql) Advent of SQL 2025 5일차 (0) | 2025.12.08 |
| [solvesql_Lv3] 미세먼지 수치의 계절간 차이(중앙값구하기) (0) | 2025.10.14 |
