WITH
user_login_date AS (
SELECT
usr_id,
DATE(login_time) AS login_date
FROM user_login_log
GROUP BY usr_id, DATE(login_time)
),
daily_login_count AS (
SELECT
login_date AS t_date,
COUNT(DISTINCT usr_id) AS A
FROM user_login_date
GROUP BY login_date
),
retained_users AS (
SELECT
t1.login_date AS t_date,
COUNT(DISTINCT t1.usr_id) AS B
FROM user_login_date t1
INNER JOIN user_login_date t2
ON t1.usr_id = t2.usr_id
AND t2.login_date = DATE_ADD(t1.login_date, INTERVAL 1 DAY)
GROUP BY t1.login_date
)
SELECT
d1.t_date as login_date,
CONCAT(ROUND(COALESCE(d2.B / d1.A * 100, 0), 2), '%') AS T1_retention_rate
FROM daily_login_count d1
LEFT JOIN retained_users d2
ON d1.t_date = d2.t_date
WHERE d1.t_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
ORDER BY d1.t_date DESC;
SELECT
COUNT(1) AS rows_num,
COUNT(DISTINCT student_id) AS students_num,
SUM(CASE WHEN score IS NOT NULL THEN 1 ELSE 0 END) AS score_num,
SUM(CASE WHEN score = 0 THEN 1 ELSE 0 END) AS score_zero_num,
SUM(CASE WHEN score IS NULL THEN 1 ELSE 0 END) AS score_null_num
FROM
scores;
WITH class_total AS (
SELECT
class_code,
COUNT(DISTINCT student_id) AS total_students
FROM students
GROUP BY class_code
),
score_range AS (
SELECT
a.class_code,
CASE
WHEN b.score >= 110 THEN 'excellent'
WHEN b.score >= 90 THEN 'good'
WHEN b.score >= 60 THEN 'pass'
ELSE 'fail'
END AS score_range
FROM students a
LEFT JOIN scores b
ON a.student_id = b.student_id
AND b.subject = '数学'
AND b.exam_date = '2024-06-30'
),
range_num AS (
SELECT
class_code,
SUM(CASE WHEN score_range = 'excellent' THEN 1 ELSE 0 END) AS excellent_count,
SUM(CASE WHEN score_range = 'good' THEN 1 ELSE 0 END) AS good_count,
SUM(CASE WHEN score_range = 'pass' THEN 1 ELSE 0 END) AS pass_count,
SUM(CASE WHEN score_range = 'fail' THEN 1 ELSE 0 END) AS fail_count
FROM score_range
GROUP BY class_code
)
SELECT
ct.class_code,
ct.total_students,
CONCAT(
rn.excellent_count,
',',
ROUND(IFNULL(rn.excellent_count / NULLIF(ct.total_students, 0), 0) * 100, 2),
'%'
) AS excellent,
CONCAT(
rn.good_count,
',',
ROUND(IFNULL(rn.good_count / NULLIF(ct.total_students, 0), 0) * 100, 2),
'%'
) AS good,
CONCAT(
rn.pass_count,
',',
ROUND(IFNULL(rn.pass_count / NULLIF(ct.total_students, 0), 0) * 100, 2),
'%'
) AS pass,
CONCAT(
rn.fail_count,
',',
ROUND(IFNULL(rn.fail_count / NULLIF(ct.total_students, 0), 0) * 100, 2),
'%'
) AS fail
FROM class_total ct
LEFT JOIN range_num rn ON ct.class_code = rn.class_code
ORDER BY ct.class_code;
with score_range as(
select
a.class_code,
case
when b.score >= 110 then 'excellent'
when b.score >= 90 then 'good'
when b.score >= 60 then 'pass'
when b.score < 60 then 'fail'
end as score_range
from students a
join scores b on a.student_id = b.student_id
where b.subject = '数学' and b.exam_date = '2024-06-30'
)
select
class_code,
sum(case when score_range = 'excellent' then 1 else 0 end) as excellent_count,
sum(case when score_range = 'good' then 1 else 0 end) as good_count,
sum(case when score_range = 'pass' then 1 else 0 end) as pass_count,
sum(case when score_range = 'fail' then 1 else 0 end) as fail_count
from score_range
group by class_code
order by class_code
WITH student_subject_scores AS (
SELECT
s.student_id,
s.name,
s.class_code,
COALESCE(MAX(CASE WHEN sc.subject = '语文' THEN sc.score END), 0) AS chinese_score,
COALESCE(MAX(CASE WHEN sc.subject = '数学' THEN sc.score END), 0) AS math_score,
COALESCE(MAX(CASE WHEN sc.subject = '英语' THEN sc.score END), 0) AS english_score,
COALESCE(MAX(CASE WHEN sc.subject = '物理' THEN sc.score END), 0) AS physics_score,
COALESCE(MAX(CASE WHEN sc.subject = '化学' THEN sc.score END), 0) AS chemistry_score,
COALESCE(MAX(CASE WHEN sc.subject = '生物' THEN sc.score END), 0) AS biology_score,
COALESCE(MAX(CASE WHEN sc.subject = '地理' THEN sc.score END), 0) AS geography_score,
COALESCE(MAX(CASE WHEN sc.subject = '历史' THEN sc.score END), 0) AS history_score,
COALESCE(MAX(CASE WHEN sc.subject = '政治' THEN sc.score END), 0) AS politics_score,
COALESCE(SUM(sc.score), 0) AS total_score
FROM students s
LEFT JOIN scores sc
ON s.student_id = sc.student_id
AND sc.exam_date = '2024-06-30'
GROUP BY s.student_id, s.name, s.class_code
),
class_max_total AS (
SELECT
class_code,
MAX(total_score) AS 班级最高总分
FROM student_subject_scores
GROUP BY class_code
)
SELECT
sss.class_code,
sss.name,
sss.chinese_score,
sss.math_score,
sss.english_score,
sss.physics_score,
sss.chemistry_score,
sss.biology_score,
sss.geography_score,
sss.history_score,
sss.politics_score,
sss.total_score
FROM student_subject_scores sss
JOIN class_max_total cmt
ON sss.class_code = cmt.class_code
AND sss.total_score = cmt.班级最高总分
ORDER BY sss.class_code;
WITH student_subject_scores AS (
SELECT
s.student_id,
s.name,
s.class_code,
COALESCE(MAX(CASE WHEN sc.subject = '语文' THEN sc.score END), 0) AS chinese_score,
COALESCE(MAX(CASE WHEN sc.subject = '数学' THEN sc.score END), 0) AS math_score,
COALESCE(MAX(CASE WHEN sc.subject = '英语' THEN sc.score END), 0) AS english_score,
COALESCE(MAX(CASE WHEN sc.subject = '物理' THEN sc.score END), 0) AS physics_score,
COALESCE(MAX(CASE WHEN sc.subject = '化学' THEN sc.score END), 0) AS chemistry_score,
COALESCE(MAX(CASE WHEN sc.subject = '生物' THEN sc.score END), 0) AS biology_score,
COALESCE(MAX(CASE WHEN sc.subject = '地理' THEN sc.score END), 0) AS geography_score,
COALESCE(MAX(CASE WHEN sc.subject = '历史' THEN sc.score END), 0) AS history_score,
COALESCE(MAX(CASE WHEN sc.subject = '政治' THEN sc.score END), 0) AS politics_score,
COALESCE(SUM(sc.score), 0) AS total_score
FROM students s
LEFT JOIN scores sc
ON s.student_id = sc.student_id
AND sc.exam_date = '2024-06-30'
GROUP BY s.student_id, s.name, s.class_code
),
class_max_total AS (
SELECT
class_code,
MAX(total_score) AS 班级最高总分
FROM student_subject_scores
GROUP BY class_code
)
SELECT
sss.name,
sss.chinese_score,
sss.math_score,
sss.english_score,
sss.physics_score,
sss.chemistry_score,
sss.biology_score,
sss.geography_score,
sss.history_score,
sss.politics_score,
sss.total_score
FROM student_subject_scores sss
JOIN class_max_total cmt
ON sss.class_code = cmt.class_code
AND sss.total_score = cmt.班级最高总分
ORDER BY sss.class_code;
WITH student_subject_scores AS (
SELECT
s.student_id,
s.name,
s.class_code,
COALESCE(MAX(CASE WHEN sc.subject = '语文' THEN sc.score END), 0) AS 语文,
COALESCE(MAX(CASE WHEN sc.subject = '数学' THEN sc.score END), 0) AS 数学,
COALESCE(MAX(CASE WHEN sc.subject = '英语' THEN sc.score END), 0) AS 英语,
COALESCE(MAX(CASE WHEN sc.subject = '物理' THEN sc.score END), 0) AS 物理,
COALESCE(MAX(CASE WHEN sc.subject = '化学' THEN sc.score END), 0) AS 化学,
COALESCE(MAX(CASE WHEN sc.subject = '生物' THEN sc.score END), 0) AS 生物,
COALESCE(MAX(CASE WHEN sc.subject = '地理' THEN sc.score END), 0) AS 地理,
COALESCE(MAX(CASE WHEN sc.subject = '历史' THEN sc.score END), 0) AS 历史,
COALESCE(MAX(CASE WHEN sc.subject = '政治' THEN sc.score END), 0) AS 政治,
COALESCE(SUM(sc.score), 0) AS 总成绩
FROM students s
LEFT JOIN scores sc
ON s.student_id = sc.student_id
AND sc.exam_date = '2024-06-30'
GROUP BY s.student_id, s.name, s.class_code
),
class_max_total AS (
SELECT
class_code,
MAX(总成绩) AS 班级最高总分
FROM student_subject_scores
GROUP BY class_code
)
SELECT
sss.name,
sss.语文,
sss.数学,
sss.英语,
sss.物理,
sss.化学,
sss.生物,
sss.地理,
sss.历史,
sss.政治,
sss.总成绩
FROM student_subject_scores sss
JOIN class_max_total cmt
ON sss.class_code = cmt.class_code
AND sss.总成绩 = cmt.班级最高总分
ORDER BY sss.class_code;
SELECT
exam_date,
MAX(CASE WHEN subject = '语文' THEN score ELSE NULL END) AS chinese_score,
MAX(CASE WHEN subject = '数学' THEN score ELSE NULL END) AS math_score,
MAX(CASE WHEN subject = '英语' THEN score ELSE NULL END) AS english_score
FROM scores
WHERE student_id = 460093 AND subject IN ('语文', '数学', '英语')
GROUP BY exam_date
ORDER BY exam_date;
select
student_id,
sum(score) as total_score
from scores
where subject in ('语文','数学','英语')
and exam_date = '2024-06-30'
group by student_id
having sum(score) > 330
order by total_score desc;