다음 두 가지 결과 세트를 생성합니다.
- OCCUPATIONS의 모든 이름을 알파벳순으로 정렬한 목록을 쿼리하고 바로 뒤에 각 직업의 첫 글자를 괄호로 묶습니다(예: 괄호로 묶음). 예: AnActorName(A), ADoctorName(D), AProfessorName(P) 및 ASingerName(S).
- OCCUPATIONS에서 각 직업의 발생 횟수를 쿼리합니다. 발생 항목을 오름차순으로 정렬하고 다음 형식으로 출력합니다.
-> 총 [occupation_count]개의 [occupation]개가 있습니다.
여기서 [occupation_count]는 OCCUPATIONS에서 직업의 발생 횟수이고 [occupation]은 소문자 직업 이름입니다. 둘 이상의 직업에 동일한 [occupation_count]가 있는 경우 알파벳순으로 정렬해야 합니다.
참고: 표에는 각 직업 유형에 대해 최소한 두 개의 항목이 있습니다.
SELECT CONCAT(NAME, '(', SUBSTRING(OCCUPATION, 1, 1), ')')
FROM OCCUPATIONS
ORDER BY NAME
, SUBSTRING(OCCUPATION, 1, 1);
SELECT CONCAT('There are a total of ', COUNT(OCCUPATION), ' ', LOWER(OCCUPATION), 's.')
FROM OCCUPATIONS
GROUP BY OCCUPATION
ORDER BY COUNT(OCCUPATION)
, OCCUPATION;
각 이름이 알파벳순으로 정렬되어 해당 직업 아래에 표시되도록 OCCUPATIONS의 직업 열을 회전합니다. 출력 열 헤더는 각각 Doctor, Professor, Singer 및 Actor여야 합니다.
참고: 직업에 해당하는 이름이 더 이상 없으면 NULL을 인쇄합니다.
SELECT MAX(CASE WHEN OCCUPATION = 'Doctor' THEN NAME END)
, MAX(CASE WHEN OCCUPATION = 'Professor' THEN NAME END)
, MAX(CASE WHEN OCCUPATION = 'Singer' THEN NAME END)
, MAX(CASE WHEN OCCUPATION = 'Actor' THEN NAME END)
FROM (
SELECT *
, ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS ROW_NUM
FROM OCCUPATIONS) SUB
GROUP BY ROW_NUM
N과 P라는 두 개의 열을 포함하는 테이블 BST가 제공됩니다. 여기서 N은 이진 트리의 노드 값을 나타내고 P는 N의 부모입니다.
노드 값에 따라 정렬된 이진 트리의 노드 유형을 찾는 쿼리를 작성하세요. 각 노드에 대해 다음 중 하나를 출력합니다.
- Root: 노드가 루트 노드인 경우.
- Leaf: 노드가 리프 노드인 경우.
- Inner: 노드가 루트 노드도 리프 노드도 아닌 경우.
SELECT N
, CASE WHEN P IS NULL THEN 'Root'
WHEN N IN (SELECT DISTINCT P FROM BST) THEN 'Inner'
ELSE 'Leaf'
END
FROM BST
ORDER BY N
앰버의 대기업은 방금 몇몇 새로운 회사를 인수했습니다. 각 회사는 다음 계층 구조를 따릅니다.
Founder => Lead Manager => Senior Manager => Manager => Employee
아래 테이블 스키마가 주어지면 회사_코드, 창립자 이름, 총 리드 관리자 수, 총 고위 관리자 수, 총 관리자 수 및 총 직원 수를 인쇄하는 쿼리를 작성하세요. company_code를 오름차순으로 출력을 정렬하십시오.
메모:
- 테이블에 중복된 레코드가 있을 수 있습니다.
- company_code는 문자열이므로 숫자로 정렬하면 안 됩니다. 예를 들어 company_code가 C_1, C_2 및 C_10인 경우 오름차순 company_code는 C_1, C_10 및 C_2가 됩니다.
SELECT A.COMPANY_CODE
, A.FOUNDER
, COUNT(DISTINCT B.LEAD_MANAGER_CODE)
, COUNT(DISTINCT C.SENIOR_MANAGER_CODE)
, COUNT(DISTINCT D.MANAGER_CODE)
, COUNT(DISTINCT E.EMPLOYEE_CODE)
FROM COMPANY A
LEFT JOIN LEAD_MANAGER B
ON A.COMPANY_CODE = B.COMPANY_CODE
LEFT JOIN SENIOR_MANAGER C
ON A.COMPANY_CODE = C.COMPANY_CODE
AND B.LEAD_MANAGER_CODE = C.LEAD_MANAGER_CODE
LEFT JOIN MANAGER D
ON A.COMPANY_CODE = D.COMPANY_CODE
AND B.LEAD_MANAGER_CODE = D.LEAD_MANAGER_CODE
AND C.SENIOR_MANAGER_CODE = D.SENIOR_MANAGER_CODE
LEFT JOIN EMPLOYEE E
ON A.COMPANY_CODE = E.COMPANY_CODE
AND B.LEAD_MANAGER_CODE = E.LEAD_MANAGER_CODE
AND C.SENIOR_MANAGER_CODE = E.SENIOR_MANAGER_CODE
AND D.MANAGER_CODE = E.MANAGER_CODE
GROUP BY A.COMPANY_CODE
, A.FOUNDER
ORDER BY A.COMPANY_CODE
P1(a, b)와 P2(c, d)를 2D 평면의 두 점으로 간주합니다.
- a는 북위도(STATION의 LAT_N)의 최소값과 같습니다.
- b는 서경의 최소값(STATION의 LONG_W)과 같습니다.
- c는 북위도(STATION의 LAT_N)의 최대값과 같습니다.
- d는 서경의 최대값(STATION의 LONG_W)과 같습니다.
점 P1과 P2 사이의 맨해튼 거리를 쿼리하고 소수점 이하 4자리로 반올림합니다.
SELECT ROUND((MAX(LAT_N) - MIN(LAT_N)) + (MAX(LONG_W) - MIN(LONG_W)), 4)
FROM STATION
P1(a, c)와 P2(b, d)를 2D 평면의 두 점으로 간주합니다. 여기서 (a, b)는 각각 북위도(LAT_N)의 최소값과 최대값이고 (c, d)는 각각 STATION에 있는 서부 경도(LONG_W)의 최소값과 최대값입니다.
점 P1과 P2 사이의 유클리드 거리를 쿼리하고 십진수 4자리를 표시하도록 답의 형식을 지정하세요.
SELECT ROUND(SQRT(POW((MAX(LAT_N) - MIN(LAT_N)), 2) + POW((MAX(LONG_W) - MIN(LONG_W)), 2)), 4)
FROM STATION
중앙값은 데이터 세트의 상위 절반과 하위 절반을 구분하는 숫자로 정의됩니다. STATION에서 북위도 중앙값(LAT_N)을 쿼리하고 답을 소수점 이하 4자리로 반올림하세요.
WITH COUNT_ALL AS (
SELECT COUNT(0) AS CONT_ALL
FROM STATION
), ROW_NUM AS (
SELECT *
, ROW_NUMBER() OVER(ORDER BY LAT_N) AS RN
FROM STATION
)
SELECT ROUND(LAT_N, 4)
FROM COUNT_ALL
, ROW_NUM
WHERE RN = ROUND(CONT_ALL / 2)
학생과 성적 이라는 두 개의 테이블이 주어집니다 . 학생 에는 ID , 이름 및 점수라는 세 개의 열이 있습니다 .
Ketty는 Eve에게 이름, 등급, 마크라는 세 개의 열이 포함된 보고서를 생성하는 작업을 제공합니다. Ketty는 8점 미만의 성적을 받은 학생의 이름을 원하지 않습니다. 보고서는 학년별로 내림차순이어야 합니다. 즉, 높은 성적이 먼저 입력됩니다. 동일한 학년(8-10)을 가진 학생이 두 명 이상인 경우 해당 학생의 이름을 알파벳순으로 정렬합니다. 마지막으로 성적이 8점 이하인 경우에는 "NULL"을 이름으로 사용하고 성적순으로 내림차순으로 나열한다. 동일한 학년(1-7)을 배정받은 학생이 두 명 이상인 경우 해당 학생의 성적을 기준으로 오름차순으로 정렬합니다.
Eve를 돕기 위한 쿼리를 작성하세요.
SELECT CASE WHEN B.GRADE >= 8 THEN A.NAME ELSE NULL END
, B.GRADE
, A.MARKS
FROM STUDENTS A
LEFT JOIN GRADES B
ON A.MARKS BETWEEN B.MIN_MARK AND B.MAX_MARK
ORDER BY B.GRADE DESC
, A.NAME
Julia는 방금 코딩 콘테스트를 마쳤습니다. 순위표를 구성하는 데 여러분의 도움이 필요합니다! 두 개 이상의 챌린지에서 만점을 달성한 해커의 이름과 hacker_id를 인쇄하는 쿼리를 작성하세요. 해커가 만점을 획득한 총 챌린지 수를 기준으로 내림차순으로 출력을 정렬하세요. 두 명 이상의 해커가 동일한 수의 챌린지에서 만점을 받은 경우 hacker_id를 오름차순으로 정렬합니다.
SELECT A.HACKER_ID
, D.NAME
FROM SUBMISSIONS A
JOIN CHALLENGES B
ON A.CHALLENGE_ID = B.CHALLENGE_ID
JOIN DIFFICULTY C
ON B.DIFFICULTY_LEVEL = C.DIFFICULTY_LEVEL
JOIN HACKERS D
ON A.HACKER_ID = D.HACKER_ID
WHERE A.SCORE = C.SCORE
GROUP BY A.HACKER_ID
, D.NAME
HAVING COUNT(A.HACKER_ID) >= 2
ORDER BY COUNT(A.HACKER_ID) DESC
, A.HACKER_ID
Harry Potter와 그의 친구들은 Ron과 함께 Ollivander 's에 있으며 마침내 Charlie의 오래된 부러진 지팡이를 교체했습니다.
헤르미온느는 선택하는 가장 좋은 방법은 강력하고 나이가 많은 비사악한 지팡이를 구입하는 데 필요한 최소 금 갈레온 수를 결정하는 것이라고 결정합니다. 론이 관심 있는 지팡이의 id, age, coin_needed, power를 내림차순으로 정렬하여 출력하는 쿼리를 작성하세요. 두 개 이상의 지팡이가 동일한 힘을 갖고 있는 경우, 나이가 많은 순서대로 결과를 정렬합니다.
SELECT A.ID
, B.AGE
, A.COINS_NEEDED
, A.POWER
FROM WANDS A
JOIN WANDS_PROPERTY B
ON A.CODE = B.CODE
WHERE B.IS_EVIL = 0
AND (A.POWER, B.AGE, A.COINS_NEEDED) IN (
SELECT C.POWER
, D.AGE
, MIN(C.COINS_NEEDED)
FROM WANDS C
JOIN WANDS_PROPERTY D
ON C.CODE = D.CODE
GROUP BY C.POWER
, D.AGE
)
ORDER BY A.POWER DESC
, B.AGE DESC
Julia는 학생들에게 몇 가지 코딩 과제를 만들도록 요청했습니다. 각 학생이 생성한 hacker_id, 이름 및 총 챌린지 수를 인쇄하는 쿼리를 작성하세요. 총 챌린지 수를 기준으로 결과를 내림차순으로 정렬합니다. 두 명 이상의 학생이 동일한 수의 챌린지를 생성한 경우 결과를 hacker_id를 기준으로 정렬합니다. 두 명 이상의 학생이 동일한 수의 챌린지를 생성했으며 개수가 생성된 최대 챌린지 수보다 적은 경우 결과에서 해당 학생을 제외합니다.
SELECT A.HACKER_ID
, A.NAME
, COUNT(B.CHALLENGE_ID)
FROM HACKERS A
LEFT JOIN CHALLENGES B
ON A.HACKER_ID = B.HACKER_ID
GROUP BY A.HACKER_ID, A.NAME
HAVING COUNT(B.CHALLENGE_ID) = (
SELECT MAX(CNT)
FROM (
SELECT HACKER_ID
, COUNT(0) AS CNT
FROM CHALLENGES
GROUP BY HACKER_ID
) SUB
)
OR COUNT(B.CHALLENGE_ID) IN (
SELECT CNT
FROM (
SELECT HACKER_ID
, COUNT(0) AS CNT
FROM CHALLENGES
GROUP BY HACKER_ID
) SUB
GROUP BY CNT
HAVING COUNT(CNT) = 1
)
ORDER BY COUNT(B.CHALLENGE_ID) DESC
, A.HACKER_ID
당신은 Julia의 마지막 코딩 콘테스트 도전을 훌륭하게 도와주었고 그녀는 당신도 이번 도전에 참여하길 원했습니다!
해커의 총점은 모든 챌린지의 최대 점수를 합한 것입니다. 점수가 내림차순으로 정렬된 해커의 hacker_id, 이름, 총점을 출력하는 쿼리를 작성하세요. 두 명 이상의 해커가 동일한 총점을 달성한 경우 hacker_id를 오름차순으로 결과를 정렬합니다. 결과에서 총 점수가 0인 모든 해커를 제외합니다.
SELECT SUB.HACKER_ID
, SUB.NAME
, SUM(SUB.SCORE)
FROM(
SELECT A.HACKER_ID
, A.NAME
, B.CHALLENGE_ID
, MAX(SCORE) AS SCORE
FROM HACKERS A
LEFT JOIN SUBMISSIONS B
ON A.HACKER_ID = B.HACKER_ID
GROUP BY A.HACKER_ID, A.NAME
, B.CHALLENGE_ID
ORDER BY A.HACKER_ID
, A.NAME
) SUB
GROUP BY SUB.HACKER_ID
, SUB.NAME
HAVING SUM(SUB.SCORE) != 0
ORDER BY SUM(SUB.SCORE) DESC
, SUB.HACKER_ID
Task_ID, Start_Date 및 End_Date라는 세 개의 열을 포함하는 Projects 테이블이 제공됩니다. 테이블의 각 행에 대해 End_Date와 Start_Date 간의 차이가 1일과 동일하다는 것이 보장됩니다.
작업의 End_Date가 연속적인 경우 해당 작업은 동일한 프로젝트의 일부입니다. Samantha는 완료된 다양한 프로젝트의 총 개수를 찾는 데 관심이 있습니다.
프로젝트를 완료하는 데 걸린 일수를 기준으로 프로젝트 시작일과 종료일을 오름차순으로 출력하는 쿼리를 작성하세요. 완료 일수가 동일한 프로젝트가 두 개 이상인 경우 프로젝트 시작 날짜를 기준으로 정렬합니다.
SELECT MIN(START_DATE)
, MAX(END_DATE)
FROM (
SELECT START_DATE
, END_DATE
, LEAD(START_DATE) OVER(ORDER BY END_DATE)
, ROW_NUMBER() OVER(ORDER BY START_DATE)
, START_DATE - ROW_NUMBER() OVER(ORDER BY START_DATE) AS YSNO_CODE
FROM PROJECTS
) SUB
GROUP BY YSNO_CODE
ORDER BY MAX(END_DATE)- MIN(START_DATE)
, MIN(START_DATE)
학생, 친구, 패키지라는 세 개의 테이블이 제공됩니다. 학생에는 ID와 이름이라는 두 개의 열이 있습니다. 친구에는 ID와 Friend_ID(유일한 가장 친한 친구의 ID)라는 두 개의 열이 있습니다. 패키지에는 ID와 Salary(월 $1,000 단위로 제공되는 급여)라는 두 개의 열이 포함되어 있습니다.
가장 친한 친구가 자신보다 더 높은 연봉을 제안받은 학생의 이름을 출력하는 쿼리를 작성하세요. 이름은 가장 친한 친구에게 제공되는 급여 금액에 따라 정렬되어야 합니다. 두 명의 학생이 동일한 급여를 받지 못한다는 것이 보장됩니다.
SELECT A.NAME
FROM STUDENTS A
LEFT JOIN FRIENDS B
ON A.ID = B.ID
LEFT JOIN PACKAGES C
ON A.ID = C.ID
LEFT JOIN PACKAGES D
ON B.FRIEND_ID = D.ID
WHERE C.SALARY < D.SALARY
ORDER BY D.SALARY
X와 Y라는 두 개의 열을 포함하는 Functions 테이블이 제공됩니다.
X1 = Y2 및 X2 = Y1인 경우 두 쌍 (X1, Y1) 및 (X2, Y2)는 대칭 쌍이라고 합니다.
모든 대칭 쌍을 X 값만큼 오름차순으로 출력하는 쿼리를 작성하세요. X1 ≤ Y1이 되는 행을 나열하세요.
SELECT DISTINCT A.*
FROM FUNCTIONS A
JOIN FUNCTIONS B
ON A.X = B.Y
AND A.Y = B.X
GROUP BY A.X
, A.Y
HAVING COUNT(A.X) > 1
OR A.X < A.Y
ORDER BY A.X
1000보다 작거나 같은 모든 소수를 인쇄하는 쿼리를 작성하세요. 결과를 한 줄에 인쇄하고 공백 대신 앰퍼샌드(&) 문자를 구분 기호로 사용합니다.
예를 들어, 모든 소수 <= 10에 대한 출력은 다음과 같습니다.
2&3&5&7
WITH RECURSIVE NUMBERS AS (
SELECT 2 AS N
UNION ALL
SELECT 1+N
FROM NUMBERS
WHERE N<1000
)
SELECT GROUP_CONCAT(N SEPARATOR '&')
FROM (
SELECT *
, CASE WHEN EXISTS (
SELECT NULL
FROM NUMBERS AS N_INNER
WHERE N_INNER.N > 1
AND N_INNER.N < NUMBERS.N
AND MOD(NUMBERS.N, N_INNER.N) = 0
) THEN 'NO PRIME'
ELSE 'PRIME'
END AS IS_PRIME
FROM NUMBERS
) SUB
WHERE SUB.IS_PRIME = 'PRIME'
Samantha는 코딩 과제와 콘테스트를 통해 다양한 대학의 많은 지원자를 인터뷰합니다. Contest_id를 기준으로 정렬된 각 컨테스트에 대해 Contest_id, hacker_id, name 및 total_submissions, total_accepted_submissions, total_views 및 total_unique_views의 합계를 인쇄하는 쿼리를 작성합니다. 4개의 합계가 모두 0인 경우 결과에서 콘테스트를 제외합니다.
참고: 특정 콘테스트를 사용하여 둘 이상의 대학에서 후보자를 심사할 수 있지만 각 칼리지는 1개의 심사 콘테스트만 개최합니다.
SELECT A.CONTEST_ID
, A.HACKER_ID
, A.NAME
, SUM(E.SUM_TS)
, SUM(E.SUM_TAS)
, SUM(D.SUM_TV)
, SUM(D.SUM_TUV)
FROM CONTESTS A
LEFT JOIN COLLEGES B
ON A.CONTEST_ID = B.CONTEST_ID
LEFT JOIN CHALLENGES C
ON B.COLLEGE_ID = C.COLLEGE_ID
LEFT JOIN (
SELECT CHALLENGE_ID
, SUM(TOTAL_VIEWS) AS SUM_TV
, SUM(TOTAL_UNIQUE_VIEWS) AS SUM_TUV
FROM VIEW_STATS
GROUP BY CHALLENGE_ID
) D
ON C.CHALLENGE_ID = D.CHALLENGE_ID
LEFT JOIN (
SELECT CHALLENGE_ID
, SUM(TOTAL_SUBMISSIONS) AS SUM_TS
, SUM(TOTAL_ACCEPTED_SUBMISSIONS) AS SUM_TAS
FROM SUBMISSION_STATS
GROUP BY CHALLENGE_ID
) E
ON C.CHALLENGE_ID = E.CHALLENGE_ID
GROUP BY A.CONTEST_ID
, A.HACKER_ID
, A.NAME
HAVING SUM(E.SUM_TS) != 0
OR SUM(E.SUM_TAS) != 0
OR SUM(D.SUM_TV) != 0
OR SUM(D.SUM_TUV) != 0
ORDER BY A.CONTEST_ID
Julia는 15일간 SQL 학습 콘테스트를 진행했습니다. 콘테스트의 시작일은 2016년 3월 1일이고 종료일은 2016년 3월 15일입니다.
매일 최소 1개의 제출물을 제출한 고유 해커의 총 수를 출력하는 쿼리를 작성하고(대회 첫날부터), 매일 최대 제출물을 제출한 해커의 hacker_id와 이름을 찾습니다. 그러한 해커가 두 명 이상 제출할 수 있는 경우 가장 낮은 hacker_id를 인쇄합니다. 쿼리는 대회의 각 날짜에 대한 정보를 날짜별로 정렬하여 인쇄해야 합니다.
SELECT SUB1.SUBMISSION_DATE
, SUB1.CNT
, SUB2.MIN_HACKER_ID
, SUB2.NAME
FROM ( // 과제를 제출해야하는 날에 실제로 과제를 제출한 학생 수
SELECT A.SUBMISSION_DATE
, COUNT(DISTINCT B.HACKER_ID) AS CNT
FROM ( // 과제를 제출해야하는 날짜
SELECT SUBMISSION_DATE
, DENSE_RANK() OVER(ORDER BY SUBMISSION_DATE) AS RNK_DATE
FROM (
SELECT DISTINCT SUBMISSION_DATE
FROM SUBMISSIONS
) A
) A
LEFT JOIN ( // 과제를 몇번 제출했는지
SELECT A.SUBMISSION_DATE
, A.HACKER_ID
, B.NAME
, DENSE_RANK() OVER(PARTITION BY A.HACKER_ID ORDER BY A.SUBMISSION_DATE) AS RNK_HACKER
FROM SUBMISSIONS A
LEFT JOIN HACKERS B
ON A.HACKER_ID = B.HACKER_ID
) B
ON A.SUBMISSION_DATE = B.SUBMISSION_DATE
AND A.RNK_DATE = B.RNK_HACKER
GROUP BY A.SUBMISSION_DATE
) SUB1
LEFT JOIN ( //일자별로 가장 많이 제출한 학생 중 HACKER_ID 가 가장 작은 1명의 이름
SELECT C.SUBMISSION_DATE
, C.MIN_HACKER_ID
, D.NAME
FROM ( // 일자별로 가장 많이 제출한 학생 중 HACKER_ID 가 가장 작은 1명
SELECT A.SUBMISSION_DATE
, MIN(A.HACKER_ID) AS MIN_HACKER_ID
FROM ( // 일자별로 학생이 제출한 과제 수
SELECT SUBMISSION_DATE
, HACKER_ID
, COUNT(0) AS CNT
FROM SUBMISSIONS
GROUP BY SUBMISSION_DATE
, HACKER_ID
) A
JOIN ( // 일자별로 가장 많이 제출한 횟수
SELECT B.SUBMISSION_DATE
, MAX(B.CNT) AS MAX_CNT
FROM (
SELECT SUBMISSION_DATE
, HACKER_ID
, COUNT(0) AS CNT
FROM SUBMISSIONS
GROUP BY SUBMISSION_DATE
, HACKER_ID
) B
GROUP BY B.SUBMISSION_DATE
) C
ON A.SUBMISSION_DATE = C.SUBMISSION_DATE
AND A.CNT = C.MAX_CNT
GROUP BY A.SUBMISSION_DATE
) C
LEFT JOIN HACKERS D
ON C.MIN_HACKER_ID = D.HACKER_ID
) SUB2
ON SUB1.SUBMISSION_DATE = SUB2.SUBM
ORDER BY SUB1.SUBMISSION_DATE