본문 바로가기

SQL/[HackerRank]

[HackerRank/MySQL] Challenges

728x90

< Problem >

학생의 ID와 이름, 만든 문제 수 구하기
조건 1.  명 이상의 학생이 동일한 수의 문제를 냈고, 그 수가 최대 문제 개수와 같다면, 해당 학생들의 ID를 기준으로 내림차순 정렬한다.
조건 2. 두 명 이상의 학생이 동일한 수의 문제를 냈고, 그 수가 최대 문제 개수보다 적다면, 해당 학생들은 결과에서 제외한다.

링크:  https://www.hackerrank.com/challenges/challenges/problem

 

Challenges | HackerRank

Print the total number of challenges created by hackers.

www.hackerrank.com


< Code >

WITH cnt AS (SELECT hacker_id, COUNT(challenge_id) AS num_c
          FROM challenges
          GROUP BY hacker_id)

SELECT DISTINCT h.hacker_id, h.name, c.num_c
FROM hackers h JOIN cnt c ON h.hacker_id = c.hacker_id
WHERE c.num_c = (SELECT MAX(num_c) FROM cnt)
                    OR c.num_c IN (SELECT num_c
                                   FROM cnt
                                   GROUP BY num_c
                                   HAVING COUNT(*)=1)
ORDER BY c.num_c DESC, h.hacker_id

 

< Lesson & Learned >

WITH: 가상 테이블을 만드는 구문. 생성된 가상 테이블은 해당 쿼리문 내에서 여러 번 참조가 가능하다.
SELECT
: 키워드와 함께 검색하고 싶은 속성의 이름을 나열
COUNT( ):  속성 값의 개수를 검색하기 위한 집계함수. NULL 속성 값은 제외하고 계산됨.

FROM: 키워드와 함께 검색하고 싶은 속성이 있는 데이블의 이름을 나열
GROUP BY: 특정 속성의 값이 같은 투플을 모아 그룹을 만들고, 그룹별로 검색. HAVING 키워드를 이용해 그룹에 대한 조건을 작성함.
DISTINCT: 결과 테이블이 튜플의 중복을 허용하지 않도록 지정

JOIN ON: 추가예정
WHERE: 키워드와 함께 비교 연산자(=, <, >=, <>)와 논리 연산자(AND, OR, NOT)를 이용한 검색 조건 제시
MAX( ): 속성 값의 최대값을 검색하기 위한 집계함수
IN 조건: 조건과 일치하는 것이 있으면 검색조건이 참. WHERE 절에서 사용됨.
ORDER BY: 결과 테이블 내용을 원하는 순서로 출력. 오름차순(기본): ASC, 내림차순: DESC

728x90