질문 목록
- 다른
- 창 기능 연습
- SQL 579 직원의 누적 급여 쿼리 어려움
- SQL162 2021년 11월 일인당 기사 검색 시간
- 각 비디오의 SQL156 평균 완료율
- SQL157 평균 재생 진행률이 60%를 초과하는 비디오 카테고리
- SQL180 특정 매장의 SPU 수
- 문의
- 연결하다
- 중합
- 정렬 및 그룹화
- 고급 쿼리 및 조인
- 하위 쿼리
- 고급 주제: 창 함수 및 CTE(공용 테이블 표현식)
-
- MySQL 공통 테이블 표현식(CTE)
- SQL 1077. 프로젝트 직원 III 중간
- SQL 1285 연속 범위의 시작 및 끝 번호 찾기
- SQL 1596 고객당 가장 자주 주문되는 품목(중요)
- SQL 1709 액세스 날짜 사이의 최대 간격 기간
- SQL 1270 회사의 CEO에게 보고하는 모든 사람
- SQL 1412 난이도가 중간 수준인 학생 찾기
- SQL 1767 실행되지 않은 작업 쌍을 찾는 것이 어렵습니다.
- SQL 1225 연속 날짜의 시스템 상태 보고 어려움
- SQL136 시험 유형별 상위 3개 점수 중간
- SQL137 난이도 두 번째로 빠른/느린 시간 차이가 시험지 길이의 절반보다 깁니다.
- SQL138 난이도 시험지를 연속으로 두 번 답할 수 있는 최대 시간 창
다른
MySQL의 @ 및 @@ 기호
조인, 왼쪽 조인, 오른쪽 조인, 전체 외부 조인
MySQL 내부 조인, 왼쪽 및 오른쪽 외부 조인 그림
창 기능 연습
SQL 579 직원의 누적 급여 쿼리 어려움
SELECT
id,
Month,
SUM(Salary) OVER(PARTITION BY id ORDER BY Month RANGE 2 PRECEDING) AS Salary
FROM
Employee
WHERE
(id, Month) NOT IN (
SELECT
id,
MAX(Month) AS Month
FROM
Employee
GROUP BY
id
)
ORDER BY
id, Month DESC
SQL162 2021년 11월 일인당 기사 검색 시간
MySQL 날짜 관련 함수
mysql의 DATE 관련 함수 세부정보
MySQL SUBDATE() 사용법 및 코드 예
MySQL SUBDATE() 함수
MySQL DATE_SUB 및 SUBDATE 함수: 날짜 빼기 연산
MySQL 타임스탬프diff() 함수
시차 함수—TIMESTAMPDIFF()
[Mysql] TIMESTAMPDIFF 함수
MySQL date_format() 함수
MySQL DATE_FORMAT() 함수
date_format: 형식 날짜 날짜 함수
date_format의 공통 매개변수 설명:
%Y-%m-%d %H:%i:%s 2023-4-24 02:41:20
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位
SELECT
DATE (in_time) dt,
ROUND(
SUM(timestampdiff (second, in_time, out_time)) / COUNT(distinct uid),
1
) avg_lensec
from
tb_user_log
where
date_format (in_time, "%Y-%m") = "2021-11"
and artical_id != 0
group by
dt
order by
avg_lensec
각 비디오의 SQL156 평균 완료율
SQL 날짜 함수 day(), Month(), year()
SQL 날짜 함수 day(), Month(), year() 다양한 사용 방법
MySQL IF 문의 세 가지 용도
MySQL의 count(1)과 count(*)의 차이점
MySQL sum(1) count(1) 사이의 차이점과 연결에 대해 간략히 설명합니다.
mysql에서 count(1)와 count(*) 사이의 차이점
MySQL SUM() 함수
MySQL 기능 사용법 FORMAT
SELECT
a.video_id,
ROUND(
SUM(IF (end_time - start_time >= duration, 1, 0)) / COUNT(start_time),
3
) AS avg_comp_play_rate
FROM
tb_user_video_log a
LEFT JOIN tb_video_info b ON a.video_id = b.video_id
WHERE
YEAR (start_time) = 2021
GROUP BY
a.video_id
ORDER BY
avg_comp_play_rate DESC;
SQL157 평균 재생 진행률이 60%를 초과하는 비디오 카테고리
SELECT
tag,
CONCAT (avg_play_progress, "%") AS avg_play_progress
FROM
(
SELECT
tag,
ROUND(
AVG(
IF (
TIMESTAMPDIFF (SECOND, start_time, end_time) > duration,
1,
TIMESTAMPDIFF (SECOND, start_time, end_time) / duration
)
) * 100,
2
) AS avg_play_progress
FROM
tb_user_video_log
JOIN tb_video_info USING (video_id)
GROUP BY
tag
HAVING
avg_play_progress > 60
ORDER BY
avg_play_progress DESC
) as t_progress
SQL180 특정 매장의 SPU 수
SELECT
style_id,
COUNT(DISTINCT item_id) AS SPU_num
FROM
product_tb
GROUP BY
style_id
ORDER BY
SPU_num DESC
문의
SQL 1873 단순 특별 보너스 계산
LIKE +% 나머지
SELECT
employee_id,
IF(
employee_id % 2 = 1 AND name NOT LIKE "M%",
salary,
0
) AS bonus
FROM
employees
ORDER BY
employee_id;
Mod 및 LEFT 기능
SELECT
employee_id,
IF(
MOD(employee_id, 2) = 1 AND LEFT(name, 1) != 'M',
salary,
0
) AS bonus
FROM
employees
ORDER BY
employee_id;
가지 구조의 CASE
SELECT
employee_id,
CASE
WHEN MOD(employee_id, 2) != 0 AND LEFT(name, 1) != 'M' THEN salary
WHEN MOD(employee_id, 2) = 0 OR LEFT(name, 1) = 'M' THEN 0
ELSE 0
END AS bonus
FROM
employees
ORDER BY
employee_id;
REGEXP 키워드는 정규식을 지정합니다.
SELECT
employee_id,
CASE
WHEN MOD(employee_id, 2) = 1 AND name NOT REGEXP '^M' THEN salary
ELSE 0
END AS bonus
FROM
employees
ORDER BY
employee_id;
SQL 1112 학생당 최고 성적 보통
윈도우 기능 - 정렬 기능
SELECT
student_id,
course_id,
grade
FROM
(
SELECT
student_id,
course_id,
grade,
RANK() OVER (PARTITION BY student_id ORDER BY grade DESC, course_id ASC) AS ranking
FROM
enrollments
) t1
WHERE
ranking = 1
ORDER BY
student_id
SQL1398 A상품과 B상품을 구매했으나 C상품은 구매하지 않은 고객
MySQL SUM(1)과 SUM(0)의 차이점
SELECT
o.customer_id,
c.customer_name
FROM
orders o
JOIN customers c ON o.customer_id = c.customer_id
GROUP BY
customer_id
HAVING
SUM(IF(product_name = 'A', 1, 0)) > 0 AND
SUM(IF(product_name = 'B', 1, 0)) > 0 AND
SUM(IF(product_name = 'C', 1, 0)) = 0
연결하다
SQL 607 영업사원 단순
SELECT
name
FROM
salesperson s
WHERE
sales_id NOT IN (
SELECT
sales_id
FROM
company c RIGHT JOIN orders o
ON c.com_id = o.com_id
WHERE c.name = "RED"
)
Simple을 판매하지 않은 SQL 1607 판매자
존재하지 않음/ IN이 아님/ LEFT JOIN 키워드
MySQL IN 및 NOT IN 사용법에 대한 자세한 설명
MySql에서 NOT IN 사용 시 주의사항
방법 1: NOT EXISTS 사용법이 익숙하지 않은 경우 내부 테이블과 외부 테이블에 대한 연결 조건을 사용해야 합니다. 외부 레이어에서는 내부 레이어에서 해당 레코드를 찾을 수 있습니다.
-- 使用 NOT EXISTS 来查找,所有销售日期中年份不等于 2020 的记录,注意 NOT EXISTS 需要使用连接字段
-- 将外层内层查询连接起来
SELECT
seller_name
FROM
seller s
WHERE NOT EXISTS(
SELECT
sale_date
FROM
orders o
WHERE
DATE_FORMAT(sale_date, "%Y") = "2020"
AND s.seller_id = o.seller_id
)
ORDER BY
seller_name
방법 2: 2020년에 판매한 직원을 필터링한 다음 외부 쿼리를 중첩하여 내부 목록에 없는 Seller_name을 필터링합니다.
-- 筛选出在 2020 年销售过的员工,然后嵌套外层查询筛选出不在内层名单的 seller_name
SELECT
seller_name
FROM
seller
WHERE
seller_id NOT IN (
SELECT
DISTINCT o.seller_id
FROM
orders o
WHERE
DATE_FORMAT(o.sale_date, "%Y") = "2020"
)
ORDER BY
seller_name
SQL 1407 최고의 여행자 단순
MySQL IFNULL() 함수
SELECT
name,
IFNULL(SUM(distance), 0) AS travelled_distance
FROM
users u LEFT JOIN
rides r ON u.id = r.user_id
GROUP BY
user_id
ORDER BY
travelled_distance DESC,
name
SQL 1440 부울 표현식 매체 평가
왼쪽 조인 두 번
SELECT
e.left_operand,
e.operator,
e.right_operand,
CASE WHEN (
(e.operator = '=' AND v1.value = v2.value) OR
(e.operator = '>' AND v1.value > v2.value) OR
(e.operator = '<' AND v1.value < v2.value)
) THEN "true" ELSE "false"
END AS value
FROM
expressions e
LEFT JOIN variables v1
ON e.left_operand = v1.name
LEFT JOIN variables v2
ON e.right_operand = v2.name
SQL 1212 쿼리 팀 포인트 중간
UNION ALL + JOIN + 하위 쿼리
SELECT
t.team_id, t.team_name, IFNULL(score, 0) num_points
FROM(
SELECT team_id, SUM(score) score
FROM(
SELECT
host_team team_id,
SUM(CASE
WHEN host_goals > guest_goals THEN 3
WHEN host_goals = guest_goals THEN 1
ELSE 0
END) score
FROM
matches
GROUP BY
host_team
UNION ALL
SELECT
guest_team team_id,
SUM(CASE
WHEN host_goals > guest_goals THEN 0
WHEN host_goals = guest_goals THEN 1
ELSE 3
END) score
FROM
matches
GROUP BY
guest_team
) b
GROUP BY
team_id
) a
RIGHT JOIN teams t ON t.team_id = a.team_id
ORDER BY num_points DESC, t.team_id
중합
SQL 1571 창고 관리자 단순
조인 + 집계 함수 SUM()
SELECT
w.name warehouse_name,
SUM(w.units * p.width * p.length * p.height) VOLUME
FROM
warehouse w LEFT JOIN products p
ON w.product_id = p.product_id
GROUP BY
w.name
SQL 586 가장 많은 주문을 받은 고객 (중요!) Simple
LIMIT 및 COUNT() 함수 사용
SELECT
customer_number
FROM
orders
GROUP BY
customer_number
ORDER BY
COUNT(*) DESC
LIMIT 0, 1
DENSE_RANK() 창 함수 및 PARTITION BY 세부 정보 사용
586. 최다 주문 고객 (창순위 기능 내 PARTITION BY 상세 내용)
SELECT
customer_number
FROM
(SELECT
*,
DENSE_RANK() OVER (ORDER BY COUNT(order_number) DESC) AS ranking
FROM
orders
GROUP BY
customer_number
) tmp
WHERE ranking = 1
SQL 1076 프로젝트 직원 II
창 전체 순위+개수
SELECT
project_id
FROM
(SELECT
project_id,
DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) AS ranking
FROM
project
GROUP BY
project_id
) tmp
WHERE ranking = 1
SQL 1082 판매 분석 I 단순
창 전체 순위 + 합계
SELECT
seller_id
FROM
(
SELECT
seller_id,
DENSE_RANK() OVER (ORDER BY SUM(price) DESC) AS ranking
FROM
sales
GROUP BY
seller_id
) tmp
WHERE ranking = 1
SQL 176 두 번째로 높은 급여 보통
창 전체 순위+IFNULL
SELECT
IFNULL(
(SELECT
DISTINCT salary
FROM
(SELECT
salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS ranking
FROM
employee
) tmp
WHERE ranking = 2),
NULL
) AS SecondHighestSalary
가장 높은 응답률을 보이는 SQL 578 쿼리 질문 중간
윈도우 전체 순위 + 합계(if) 사용량 + 지표 계산
SELECT
question_id survey_log
FROM
(SELECT
question_id,
DENSE_RANK() OVER (ORDER BY SUM(IF(action = "answer", 1, 0))
/ SUM(IF(action = "show", 1, 0 )) DESC) AS ranking
FROM
surveylog
GROUP BY
question_id
) tmp
WHERE ranking = 1
ORDER BY question_id
LIMIT 0, 1
SQL 602 친구 응용 프로그램 II: 친구가 가장 많은 사람은 누구입니까?
창 종합 순위 + UNION ALL
SELECT
requester_id AS id,
num
FROM
(SELECT
requester_id,
DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) AS ranking,
COUNT(*) AS num
FROM
(
SELECT * FROM requestaccepted r1
UNION
SELECT
accepter_id AS requester_id,
requester_id AS accepter_id,
accepter_id
FROM requestaccepted r2
) t1
GROUP BY
requester_id
) t2
WHERE ranking = 1
SQL 1741 각 직원이 보낸 총 시간 찾기
GROUP BY를 두 번
SELECT
event_day AS day,
emp_id,
SUM(out_time - in_time) AS total_time
FROM
employees e
GROUP BY
event_day, emp_id
SQL 1173 즉석음식배달 I
ROUND()는 소수점 이하 자릿수 기능을 유지합니다.
SELECT
ROUND(
(SELECT COUNT(*) FROM delivery WHERE order_date = customer_pref_delivery_date) /
(SELECT COUNT(*) FROM delivery) * 100,
2
) AS immediate_percentage
정렬 및 그룹화
SQL 1587 은행 계좌 요약 II
SELECT
name,
SUM(amount) AS balance
FROM
users u RIGHT JOIN transactions t
ON u.account = t.account
GROUP BY
t.account
HAVING
SUM(amount) > 10000
SQL 1050 3회 이상 함께 작업한 배우 및 감독
SELECT
actor_id,
director_id
FROM
actordirector ad
GROUP BY
actor_id,
director_id
HAVING
COUNT(*) >= 3
SQL 1511 소비자 주문 빈도 단순
MySQL LEFT() 함수
HAVING, SUM IF
SELECT
customer_id,
name
FROM
customers
WHERE
customer_id IN(
SELECT
customer_id
FROM
product p RIGHT JOIN orders o
ON p.product_id = o.product_id
GROUP BY
customer_id
HAVING
SUM(IF(LEFT(order_date, 7) = '2020-06', price * quantity, 0)) >= 100 AND
SUM(IF(LEFT(order_date, 7) = '2020-07', price * quantity, 0)) >= 100
)
SQL 1693 일상적인 리더 및 파트너
개수(개별 xxx)
SELECT
date_id,
make_name,
COUNT(DISTINCT lead_id) AS unique_leads,
COUNT(DISTINCT partner_id) AS unique_partners
FROM
dailysales d
GROUP BY
date_id,
make_name
SQL 1501 안심하고 투자할 수 있는 국가 (중요) Medium
SUBSTR() 차단 문자열 함수
UNION+JOIN 작성방법
SELECT
name as country
FROM
(SELECT caller_id AS call_id, duration FROM calls
UNION ALL
SELECT callee_id AS call_id, duration FROM calls
) a
LEFT JOIN
(SELECT id, c.name
FROM person p LEFT JOIN country c
ON LEFT(p.phone_number, 3) = c.country_code
) b
ON call_id = id
GROUP BY
name
HAVING AVG(duration) > (SELECT AVG(duration) FROM calls)
고급 쿼리 및 조인
SQL 603 연속 공석
셀프 조인 JOIN 및 ABS() 사용
SELECT
DISTINCT a.seat_id
FROM
cinema a JOIN cinema b
ON abs(a.seat_id - b.seat_id) = 1 AND a.free = true AND b.free = true
ORDER BY
a.seat_id;
SQL 1795 다양한 매장의 각 제품 가격
열에서 행으로
SELECT product_id, 'store1' store, store1 price FROM products WHERE store1 IS NOT NULL
UNION
SELECT product_id, 'store2' store, store2 price FROM products WHERE store2 IS NOT NULL
UNION
SELECT product_id, 'store3' store, store3 price FROM products WHERE store3 IS NOT NULL;
행에서 열로
SELECT
product_id,
SUM(IF(store = 'store1', price, NULL)) 'store1',
SUM(IF(store = 'store2', price, NULL)) 'store2',
SUM(IF(store = 'store3', price, NULL)) 'store3'
FROM
Products1
GROUP BY product_id ;
SQL 613 직선에서 가장 가까운 거리
ABS() 및 MIN() 함수 사용
SELECT
MIN(ABS(p1.x - p2.x)) AS shortest
FROM
point p1 JOIN point p2
ON p1.x != p2.x
;
정보가 누락된 SQL 1965 직원
UNION 및 JOIN 사용
SELECT
employee_id
FROM(
SELECT employee_id FROM employees e
UNION
SELECT employee_id FROM salaries s
) t
WHERE
employee_id NOT IN (
SELECT
employee_id
FROM
employees e JOIN salaries s
USING(employee_id)
)
ORDER BY
employee_id
SQL 1264 페이지 권장 사항 매체
SELECT
DISTINCT page_id recommended_page
FROM
likes
WHERE
user_id IN (
SELECT
user2_id
FROM (
SELECT user1_id, user2_id FROM friendship
UNION ALL
SELECT user2_id, user1_id FROM friendship
) t
WHERE
user1_id = 1
) AND page_id NOT IN (SELECT page_id FROM likes WHERE user_id = 1)
SQL 608 트리 노드 매체
SELECT
id,
CASE
WHEN COUNT(*) = 1 AND SUM(IF(p_id IS NULL, 1, 0)) = 0 THEN 'Leaf'
WHEN COUNT(*) > 1 AND SUM(IF(p_id IS NULL, 1, 0)) = 0 THEN 'Inner'
WHEN COUNT(*) >= 1 AND SUM(IF(p_id IS NULL, 1, 0)) > 0 THEN 'Root'
END AS type
FROM(
SELECT id, p_id FROM tree
UNION ALL
SELECT p_id, id FROM tree
) t
WHERE
id IS NOT NULL
GROUP BY
id
SQL 534 게임플레이 분석 III 중간
창 집계 함수의 누적 합계
SELECT
player_id,
event_date,
SUM(games_played) OVER (PARTITION BY player_id ORDER BY event_date ASC) games_played_so_far
FROM
activity;
SQL 1783 그랜드 슬램 수 매체
전통적인 데카르트 곱
SELECT
player_id,
player_name,
SUM(p.player_id = c.Wimbledon) + SUM(p.player_id = c.Fr_open)
+ SUM(p.player_id = c.US_open) + SUM(p.player_id = c.Au_open) AS grand_slams_count
FROM
championships c JOIN players p
GROUP BY
p.player_id
HAVING
grand_slams_count > 0
SQL 1747 Leetflex 계정은 금지되어야 합니다
데카르트 곱, BETWEEN 키워드
SELECT
DISTINCT a.account_id
FROM
LogInfo a JOIN LogInfo b
WHERE
a.account_id = b.account_id
AND a.ip_address != b.ip_address
AND (a.logout BETWEEN b.login AND b.logout)
하위 쿼리
SQL 1303 팀원 수 찾기 (중요)
윈도우 함수 COUNT()
group by 문으로 인해 행 수가 단일 행으로 줄어드는 문제를 방지하려면 윈도우 기능을 사용하는 것이 좋습니다.
SELECT
employee_id,
COUNT(employee_id) OVER(PARTITION BY team_id) AS team_size
FROM
Employee
고급 주제: 창 함수 및 CTE(공용 테이블 표현식)
MySQL 공통 테이블 표현식(CTE)
MySQL 공통 테이블 표현식(CTE)
MySQL CTE(공통 테이블 표현식)
SQL 1077. 프로젝트 직원 III 중간
윈도우 순위 기능, CTE
WITH cte AS(
SELECT
p.project_id,
e.employee_id,
DENSE_RANK() OVER (PARTITION BY p.project_id ORDER BY e.experience_years DESC) AS ranking
FROM
Project p JOIN Employee e
USING(employee_id)
)
SELECT
project_id,
employee_id
FROM
cte
WHERE
ranking = 1
SQL 1285 연속 범위의 시작 및 끝 번호 찾기
연속 간격 및 창 함수 ROW_NUMBER()
SELECT
MIN(log_id) start_id,
MAX(log_id) end_id
FROM
(SELECT
log_id,
log_id - ROW_NUMBER() OVER() AS diff
FROM
Logs
) t
GROUP BY
diff
SQL 1596 고객당 가장 자주 주문되는 품목(중요)
PARTITION BY + ORDER BY + 외부 GROUP BY + COUNT()
SELECT
customer_id,
product_id,
product_name
FROM
(SELECT
customer_id,
product_id,
product_name,
DENSE_RANK() OVER (PARTITION BY customer_id ORDER BY COUNT(*) DESC) AS ranking
FROM
Orders o JOIN Products p
USING(product_id)
GROUP BY
customer_id, product_id
) t
WHERE
ranking = 1
SQL 1709 액세스 날짜 사이의 최대 간격 기간
LEAD() 함수 및 LAG() 함수
MySQL의 LAG() 함수, LEAD() 함수 사용법
MYSQL lag(), Lead() 함수 사용법
SELECT
user_id,
MAX(TIMESTAMPDIFF(DAY, visit_date, next_day)) AS biggest_window
FROM
(SELECT
user_id,
visit_date,
LEAD(visit_date, 1, "2021-1-1") OVER (PARTITION BY user_id ORDER BY visit_date ASC) AS next_day
FROM
UserVisits
) t
GROUP BY
user_id
ORDER BY
user_id
SQL 1270 회사의 CEO에게 보고하는 모든 사람
방법 1: UNION ALL, 하위 쿼리
SELECT DISTINCT employee_id FROM (
SELECT employee_id
FROM Employees WHERE manager_id = 1
UNION ALL
SELECT employee_id
FROM Employees WHERE manager_id IN (
SELECT employee_id FROM Employees WHERE manager_id = 1
)
UNION ALL
SELECT employee_id
FROM Employees WHERE manager_id IN (
SELECT employee_id FROM Employees WHERE manager_id IN (
SELECT employee_id FROM Employees WHERE manager_id = 1
)
)
) T WHERE employee_id != 1
방법 2: 가입
SELECT
e1.employee_id
FROM
Employees e1 JOIN Employees e2
ON e1.manager_id = e2.employee_id
JOIN Employees e3
ON e2.manager_id = e3.employee_id
WHERE
e1.employee_id != 1 AND e3.manager_id = 1
SQL 1412 난이도가 중간 수준인 학생 찾기
밀도_순위()
Windowing 기능은 결과를 위쪽으로 정렬한 다음 뒤쪽으로 정렬합니다. 두 열 모두 1이 아닌 한 중앙에 있습니다.
WITH cte AS(
SELECT
student_id,
IF(DENSE_RANK() OVER (PARTITION BY exam_id ORDER BY score DESC) = 1, 1, 0) AS d_rank,
IF(DENSE_RANK() OVER (PARTITION BY exam_id ORDER BY score) = 1, 1, 0) AS a_rank
FROM
Exam
)
SELECT
student_id,
student_name
FROM
Student s JOIN cte
USING(student_id)
GROUP BY
student_id
HAVING
SUM(d_rank) = 0 AND SUM(a_rank) = 0
ORDER BY
student_id
SQL 1767 실행되지 않은 작업 쌍을 찾는 것이 어렵습니다.
CTE 재귀
WITH RECURSIVE cte(task_id, subtask_id) AS (
SELECT task_id, subtasks_count FROM Tasks
UNION
SELECT task_id, subtask_id - 1 FROM cte WHERE subtask_id > 1
)
SELECT
task_id,
subtask_id
FROM
cte LEFT JOIN Executed e
USING (task_id, subtask_id)
WHERE
e.subtask_id IS NULL
ORDER BY
task_id, subtask_id
SQL 1225 연속 날짜의 시스템 상태 보고 어려움
차이 diff, SUBDATE() 날짜 함수를 사용한 연속 간격
SELECT
tktype AS period_state,
MIN(date_time) AS start_date,
MAX(date_time) AS end_date
FROM
(
SELECT
tktype,
date_time,
SUBDATE(date_time, INTERVAL ROW_NUMBER() OVER (PARTITION BY tktype ORDER BY date_time) DAY) AS diff
FROM
(
SELECT
'failed' tktype,
fail_date date_time
FROM
Failed
UNION ALL
SELECT
'succeeded' tktype,
success_date date_time
FROM
Succeeded
) t1
) t2
WHERE
date_time BETWEEN "2019-01-01" AND "2019-12-31"
GROUP BY
tktype, diff
ORDER BY
start_date
SQL136 시험 유형별 상위 3개 점수 중간
ROW_NUMBER(), PARTITION BY, GROUP BY
SELECT
tag,
uid,
ranking
FROM
(SELECT
b.tag,
a.uid,
ROW_NUMBER() OVER (PARTITION BY tag ORDER BY MAX(a.score) DESC, MIN(a.score) DESC, a.uid DESC) AS ranking
FROM
exam_record a LEFT JOIN examination_info b
ON a.exam_id = b.exam_id
GROUP BY
b.tag, a.uid
) t
WHERE
ranking <= 3
SQL137 난이도 두 번째로 빠른/느린 시간 차이가 시험지 길이의 절반보다 깁니다.
TIMESTAMPDIFF()、ROW_NUMBER()、CASE WHEN
SELECT
exam_id,
duration,
release_time
FROM
(
SELECT
exam_id,
duration,
release_time,
SUM(
CASE
WHEN rank1 = 2 THEN costtime
WHEN rank2 = 2 THEN -costtime
ELSE 0
END
) AS sub
FROM
(
SELECT
e_i.exam_id,
duration,
release_time,
TIMESTAMPDIFF(MINUTE, start_time, submit_time) AS costtime,
ROW_NUMBER() OVER (
PARTITION BY e_r.exam_id
ORDER BY TIMESTAMPDIFF(MINUTE, start_time, submit_time) DESC
) AS rank1,
ROW_NUMBER() OVER (
PARTITION BY e_r.exam_id
ORDER BY TIMESTAMPDIFF(MINUTE, start_time, submit_time) ASC
) AS rank2
FROM
exam_record e_r LEFT JOIN examination_info e_i
ON e_r.exam_id = e_i.exam_id
WHERE
submit_time IS NOT NULL
) t1
GROUP BY
exam_id
) t2
WHERE
sub * 2 >= duration
ORDER BY
exam_id DESC
SQL138 난이도 시험지를 연속으로 두 번 답할 수 있는 최대 시간 창
WITH t2 AS(
SELECT
uid,
COUNT(start_time) AS total, -- 用户2021年作答的次数
DATEDIFF(MAX(start_time), MIN(start_time)) + 1 AS diff_time, -- 头尾作答时间窗
MAX(DATEDIFF(next_time, start_time)) + 1 AS days_window -- 最大间隔天数
FROM
(
SELECT
uid,
start_time,
LEAD(start_time, 1) OVER (PARTITION BY uid ORDER BY start_time) AS next_time -- 第二次作答时间
FROM
exam_record
WHERE
YEAR(start_time) = 2021
) t1
GROUP BY
uid
)
SELECT
uid,
days_window,
ROUND(total * days_window / diff_time, 2) AS avg_exam_cnt
FROM
t2
WHERE
diff_time > 1
ORDER BY
days_window DESC, avg_exam_cnt DESC