주말에 보았던 SQL 문제에 대하여 정리해보았다,
다음과 같은 테이블이 있다
도시 좋아요
범계 Y
평촌 N
금정 Y
금정 N
안양 Y
안양 Y
안양 N
석수 Y
석수 N
석수 N
조건은 다음과 같다.
같은 도시중에 좋아요가 N보다 Y가 많은 도시만 출력하여라.
당시에 쿼리를 작성할때 group by로 도시와 좋아요 컬럼을 잡고 partition by 로 count 값을 빼내어 desc를 잡고 한번 더 감싸서
where 절에 LIKES = 'Y' AND MAXLIKE =1인것을 뽑아내는 아래와 같은 쿼리를 생각하고 작업을 진행하였다, 하지만 시간이 다되었을때쯤 보니
위의 테이블의 데이터라 가정하였을때 금정은 Y,N이 각각 1개씩 들어있으나, 아래와 같은 쿼리를 사용시에는 이 부분은 간과하게되어버렸다.
해당 부분을 생각하다가 시간이 초과되어 어쩔수 없이 진행중이던 상태로 제출하였으나, 종료 후 생각을 다시 되뇌어 풀어보도록 하였다.
SELECT NAME FROM (
SELECT
NAME , LIKES,
ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY COUNT DESC) as MAXLIKE
FROM (
SELECT NAME,LIKES, COUNT(LIKES) AS COUNT FROM CITY GROUP BY NAME, LIKES
) )
WHERE LIKES = 'Y' AND MAXLIKE =1;
위와 같은 쿼리로 생각이 고정되어있었기에 아래와 같은 방법을 생각해내는것에 꽤나 오랜시간이 걸렸다.
위 쿼리보다 훨씬 단순한 방법으로 정답을 도출해낼 수 있었으며, 단순히 LIKES가 Y인것과 LIKES가 N인것의 카운트를 각각 뽑아내어 '-'연산을 수행하고
0보다 큰값을 뽑아내면 되는 단순한 작업이었다, 다음번에 이런 작업을 만나게 된다면 쉽게 쉽게 풀도록 하자.
=======================================================================================================================================
SELECT A.NAME FROM (SELECT NAME, COUNT(NAME) AS COUNT
FROM CITY
WHERE LIKES ='Y'
GROUP BY NAME) A
LEFT OUTER JOIN
(SELECT NAME, COUNT(NAME) AS BCOUNT
FROM CITY
WHERE LIKES ='N'
GROUP BY NAME) B
ON A.NAME = B.NAME
WHERE A.COUNT - NVL(BCOUNT,0) > 0
'Database' 카테고리의 다른 글
IntelliJ와 Oracle 연동 (0) | 2023.11.30 |
---|---|
Oracle 설치 및 계정 추가 (0) | 2023.11.27 |
SQL lock 관련 정리 (1) | 2023.11.09 |
ORACLE_실전_그룹별_최대값_조회 (0) | 2023.11.09 |
구분자를 이용하여 로우 늘리기 (0) | 2023.11.08 |