본문 바로가기
Database

ORACLE_실전문제

by Lcoding 2023. 11. 9.
반응형

주말에 보았던 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

# 로딩 화면 동작 코드(Code) 설정하기
loading