https://www.hackerrank.com/challenges/weather-observation-station-4/problem?isFullScreen=true
Weather Observation Station 4 | HackerRank
Find the number of duplicate CITY names in STATION.
www.hackerrank.com
Find the difference between the total number of CITY entries in the table and the number of distinct CITY entries in the table.
문제에서는 테이블을 구성하는 총 city(중복허용)의 갯수와 고유 city의 갯수의 차를 출력하길 원한다. 쿼리는 아래와 같이 쉽게 작성할 수 있다.
SELECT COUNT(city) - COUNT(DISTINCT city)
FROM station;
이때, 여기서 COUNT() 함수가 어떻게 작동하는지 잘 알고 넘어가면 좋다. 특히, NULL값이 존재할때 COUNT가 작동하는 방식을 알아야 한다. 아래 표를 예시로 살펴보자.
VALUE |
NULL |
1 |
1 |
0 |
0 |
4 |
3 |
COUNT(*)
COUNT(*)은 NULL값을 포함해, 모든 행을 카운트한다. 행에 NULL이 있더라도 모든 행을 카운트한다. 위의 테이블이 있을때 COUNT(*)를 입력한다면, 7을 출력한다.
COUNT(VALUE)
그러나, COUNT() 괄호안에 필드를 지정해주면 NULL값을 헤아리지 않는다. COUNT(VALUE)는 VALUE 칼럼의 행이 몇개인지 카운트하는 것이며, NULL은 갯수로 치지않는다. 그래서 6을 출력한다.
COUNT(DISTINCT VALUE)
마지막으로, COUNT(DISTINCT VALUE)는 NULL을 제외한 중복되지 않는 값을 헤아린다. 그래서 4를 출력한다. 조금 헷갈릴수있는데, VALUE의 중복되지 않는 값을 직관적으로 생각하면 NULL, 1, 0, 4, 3으로 5개라고 생각할 수 있기 때문이다. 그러나 NULL은 고유값으로 여기지 않는다. COUNT()안에 특정 필드를 지정해주면 NULL을 헤아리지 않는다는것을 상기하는 것이 중요하다.
'sql' 카테고리의 다른 글
[SQL] ROW_NUMBER / RANK / DENSE_RANK (0) | 2022.12.27 |
---|---|
[SQL] NESTED CASE (0) | 2022.12.26 |
[SQL] 조건에 맞는 숫자 탐색 (0) | 2022.12.24 |
[SQL] REGEXP (0) | 2022.12.24 |
[SQL] 조건에 맞는 문자열 검색 (0) | 2022.12.23 |