PTA: preguntas complementarias de sql (4)

Tabla de contenido

Encuentra el compañero de clase con el GPA más bajo en cada escuela

Estructura de la tabla:

muestra de la tabla

Salida de muestra:

Encuentre los detalles del salario actual junto con el número de departamento dept_no

describir

Distribución a nivel de usuario de las personas cuyas puntuaciones en el papel de respuestas son superiores a 80

describir

Número de encuestados y puntajes promedio el día en que se publica el documento de prueba

Estructura de la tabla:

muestra de la tabla

Salida de muestra:

 Filtrar usuarios con fechas activas de logros de apodos limitadas

describir


Encuentra el compañero de clase con el GPA más bajo en cada escuela

Ahora la operación quiere encontrar a los estudiantes con el promedio más bajo en cada escuela para hacer una investigación, saque el promedio más bajo en cada escuela.

Sugerencia: utilice la instrucción SELECT para responder.

Estructura de la tabla:

Escriba aquí la instrucción SQL que define la estructura de la tabla. Por ejemplo:


drop table if exists user_profile;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int ,
`question_cnt` int ,
`answer_cnt` int 
);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);

muestra de la tabla

Proporcione aquí una muestra de la tabla correspondiente a la estructura de la tabla anterior. Por ejemplo

user_profilesuperficie:

 

Salida de muestra:

Proporcione un resultado de muestra aquí. Por ejemplo:

6543|Universidad de Pekín|3.200

4321|Universidad de Fudan|3.600

2131|Universidad de Shandong|3.300

2315|Universidad de Zhejiang|3.600

  • Restricciones: El gpa más bajo se parece a min(gpa), pero debe tenerse en cuenta que es el más bajo de cada escuela, no el más bajo global. Cuando se alcanza el min(gpa), se pierde el DNI del compañero correspondiente, y si lo haces directamente, no podrás obtener el DNI del alumno correspondiente al menor GPA;
  • Use group by para agrupar las escuelas, luego calcule el gpa mínimo de cada escuela y luego encuentre la identificación del estudiante en esta escuela que es igual a este gpa. Tenga en cuenta que si el gpa mínimo corresponde a varios estudiantes, todos serán de salida.Si el título no aclara esta situación, solo entiéndalo psicológicamente.
SELECT device_id,university,gpa
FROM user_profile
WHERE (university,gpa) IN (SELECT university, min(gpa)
                FROM user_profile
                GROUP BY university)
ORDER BY university

Encuentre los detalles del salario actual junto con el número de departamento dept_no

describir

Existe una tabla de salarios perfil de salarios de todos los empleados de la siguiente manera:

emp_no salario partir de la fecha hasta la fecha
10001 88958 2002-06-22 9999-01-01
10002 72527 2001-08-02 9999-01-01
10003 43311 2001-12-01 9999-01-01

Hay un resumen de la tabla de liderazgo dept_manager para cada departamento de la siguiente manera:

no_depto emp_no hasta la fecha
d001 10001 9999-01-01
d002 10003 9999-01-01

Encuentre los detalles salariales de los líderes actuales de cada departamento y el número de departamento correspondiente dept_no. Los resultados de salida se ordenan en orden ascendente de salarios.emp_no, y tenga en cuenta que la columna dept_no en los resultados de salida es la última columna. del ejemplo anterior es el siguiente:

emp_no salario partir de la fecha hasta la fecha no_depto
10001 88958 2002-06-22 9999-01-01 d001
10003 43311 2001-12-01 9999-01-01 d002
select d.emp_no,s.salary,s.from_date,s.to_date,d.dept_no
from dept_manager d left join salaries s on d.emp_no=s.emp_no
order by s.emp_no

Distribución a nivel de usuario de las personas cuyas puntuaciones en el papel de respuestas son superiores a 80

describir

Tabla de información de usuario existente user_info (ID de usuario de uid, apodo de apodo, valor de logro de logro, nivel de nivel, dirección de carrera laboral, registro_hora de registro):

identificación fluido apodo logro nivel trabajo registro_hora
1 1001 Niu Ke No. 1 3100 7 algoritmo 2020-01-01 10:00:00
2 1002 Niu Ke No. 2 2100 6 algoritmo 2020-01-01 10:00:00
3 1003 Niu Ke No. 3 1500 5 algoritmo 2020-01-01 10:00:00
4 1004 Niuke No.4 1100 4 algoritmo 2020-01-01 10:00:00
5 1005 Niu Ke No. 5 1600 6 C++ 2020-01-01 10:00:00
6 1006 Niu Ke No. 6 3000 6 C++ 2020-01-01 10:00:00

Tabla de información de la prueba de examen exam_info (exam_id identificación de la prueba de examen, etiqueta categoría de la prueba de examen, dificultad dificultad de la prueba de examen, duración duración del examen, liberación_hora liberación):

identificación id_examen etiqueta dificultad duración tiempo de liberación
1 9001 sql duro 60 2021-09-01 06:00:00
2 9002 C++ fácil 60 2021-09-01 06:00:00
3 9003 algoritmo medio 80 2021-09-01 10:00:00

Tabla de información de respuestas del examen exam_record (id de usuario de uid, ID de prueba de exam_id, hora de inicio, hora de inicio de respuesta, hora de entrega de envío, puntuación de puntuación):

identificación fluido id_examen hora de inicio tiempo_enviar puntaje
1 1001 9001 2021-09-01 09:01:01 2021-09-01 09:41:01 79
2 1002 9003 2021-09-01 12:01:01 2021-09-01 12:21:01 60
3 1002 9002 2021-09-01 12:01:01 2021-09-01 12:31:01 70
4 1002 9001 2021-09-01 19:01:01 2021-09-01 19:40:01 80
5 1002 9003 2021-08-01 12:01:01 2021-08-01 12:21:01 60
6 1002 9002 2021-09-01 12:01:01 2021-09-01 12:31:01 70
7 1002 9001 2021-09-01 19:01:01 2021-09-01 19:40:01 85
8 1002 9002 2021-09-01 12:01:01 (NULO) (NULO)
9 1003 9003 2021-09-07 10:01:01 2021-09-07 10:31:01 86
10 1003 9003 2021-09-08 12:01:01 2021-09-08 12:11:01 40
11 1003 9001 2021-09-01 13:01:01 2021-09-01 13:41:01 81
12 1003 9002 2021-09-01 14:01:01 (NULO) (NULO)
13 1003 9003 2021-09-08 15:01:01 (NULO) (NULO)
14 1005 9001 2021-09-01 12:01:01 2021-09-01 12:31:01 90
15 1005 9002 2021-09-01 12:01:01 2021-09-01 12:31:01 88
dieciséis 1006 9002 2021-09-01 12:11:01 2021-09-01 12:31:01 89

统计作答SQL类别的试卷得分大于过80的人的用户等级分布,按数量降序排序(保证数量都不同)。示例数据结果输出如下:

level level_cnt
6 2
5 1

解释:9001为SQL类试卷,作答该试卷大于80分的人有1002、1003、1005共3人,6级两人,5级一人。

思路:

  • 按等级分组,计算每个等级的符合条件的人数。知识点:group by
  • 只挑选类别为SQL、且得分大于80的不同的用户进行统计人数,相同的用户只统计一次:
  • 按照人数的降序,相同情况下等级降序输出。order by level_cnt desc, level desc
select level,count(*) level_cnt
from user_info
where uid in(select uid 
            from exam_record er join examination_info ei on er.exam_id=ei.exam_id
            where score>80
            and tag='SQL')
group by level
order by level_cnt desc

试卷发布当天作答人数和平均分

请计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score,按人数降序,相同人数的按平均分升序。

提示:请使用SELECT语句作答。

表结构:

drop table if exists examination_info,user_info,exam_record;
CREATE TABLE examination_info (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    exam_id int UNIQUE NOT NULL COMMENT '试卷ID',
    tag varchar(32) COMMENT '类别标签',
    difficulty varchar(8) COMMENT '难度',
    duration int NOT NULL COMMENT '时长',
    release_time datetime COMMENT '发布时间'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE user_info (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid int UNIQUE NOT NULL COMMENT '用户ID',
    `nick_name` varchar(64) COMMENT '昵称',
    achievement int COMMENT '成就值',
    level int COMMENT '用户等级',
    job varchar(32) COMMENT '职业方向',
    register_time datetime COMMENT '注册时间'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE exam_record (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid int NOT NULL COMMENT '用户ID',
    exam_id int NOT NULL COMMENT '试卷ID',
    start_time datetime NOT NULL COMMENT '开始时间',
    submit_time datetime COMMENT '提交时间',
    score tinyint COMMENT '得分'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

表样例

user_info表:

id uid nick_name achievement level job register_time
1 1001 牛客1号 3100 7 算法 2020-01-01 10:00:00
2 1002 牛客2号 2100 6 算法 2020-01-01 10:00:00
3 1003 牛客3号 1500 5 算法 2020-01-01 10:00:00
4 1004 牛客4号 1100 4 算法 2020-01-01 10:00:00
5 1005 牛客5号 1600 6 C++ 2020-01-01 10:00:00
6 1006 牛客6号 3000 6 C++ 2020-01-01 10:00:00

输出样例:

exam_id uv avg_score
9001 3 81.3
select er.exam_id, count(distinct er.uid) uv,round(avg(er.score),1) avg_score
from examination_info ei,exam_record er
where ei.exam_id=er.exam_id
and ei.tag='SQL'
and date_format(ei.release_time,'%Y%m%d')=date_format(er.start_time,'%Y%m%d')
and er.uid in(select uid
             from user_info
             where level>5)
group by er.exam_id
order by uv desc,avg_score asc

 筛选限定昵称成就值活跃日期的用户

描述

现有用户信息表user_info(uid用户ID,nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间):

id uid nick_name achievement level job register_time
1 1001 牛客1号 1000 2 算法 2020-01-01 10:00:00
2 1002 牛客2号 1200 3 算法 2020-01-01 10:00:00
3 1003 进击的3号 2200 5 算法 2020-01-01 10:00:00
4 1004 牛客4号 2500 6 算法 2020-01-01 10:00:00
5 1005 牛客5号 3000 7 C++ 2020-01-01 10:00:00

试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分):

id uid exam_id start_time submit_time score
1 1001 9001 2020-01-02 09:01:01 2020-01-02 09:21:59 80
3 1001 9002 2021-02-02 19:01:01 2021-02-02 19:30:01 87
2 1001 9001 2021-05-02 10:01:01 (NULL) (NULL)
4 1001 9001 2021-06-02 19:01:01 2021-06-02 19:32:00 20
6 1001 9002 2021-09-01 12:01:01 (NULL) (NULL)
5 1001 9002 2021-09-05 19:01:01 2021-09-05 19:40:01 89
11 1002 9001 2020-01-01 12:01:01 2020-01-01 12:31:01 81
12 1002 9002 2020-02-01 12:01:01 2020-02-01 12:31:01 82
13 1002 9002 2020-02-02 12:11:01 2020-02-02 12:31:01 83
7 1002 9002 2021-05-05 18:01:01 2021-05-05 18:59:02 90
16 1002 9001 2021-09-06 12:01:01 2021-09-06 12:21:01 80
17 1002 9001 2021-09-06 12:01:01 (NULL) (NULL)
18 1002 9001 2021-09-07 12:01:01 (NULL) (NULL)
8 1003 9003 2021-02-06 12:01:01 (NULL) (NULL)
9 1003 9001 2021-09-07 10:01:01 2021-09-07 10:31:01 89
10 1004 9002 2021-08-06 12:01:01 (NULL) (NULL)
14 1005 9001 2021-02-01 11:01:01 2021-02-01 11:31:01 84
15 1006 9001 2021-02-01 11:01:01 2021-02-01 11:31:01 84

题目练习记录表practice_record(uid用户ID, question_id题目ID, submit_time提交时间, score得分):

id uid question_id submit_time score
1 1001 8001 2021-08-02 11:41:01 60
2 1002 8001 2021-09-02 19:30:01 50
3 1002 8001 2021-09-02 19:20:01 70
4 1002 8002 2021-09-02 19:38:01 70
5 1003 8002 2021-09-01 19:38:01 80

请找到昵称以『牛客』开头『号』结尾、成就值在1200~2500之间,且最近一次活跃(答题或作答试卷)在2021年9月的用户信息。

由示例数据结果输出如下:

uid nick_name achievement
1002 牛客2号 1200

解释:昵称以『牛客』开头『号』结尾且成就值在1200~2500之间的有1002、1004;

1002最近一次试卷区活跃为2021年9月,最近一次题目区活跃为2021年9月;1004最近一次试卷区活跃为2021年8月,题目区未活跃。

因此最终满足条件的只有1002。

 思路:
  • 在practice_record,exam_record中筛选出月份是2021年9月
    • where date_format(submit_time, '%Y%m') = '202109' 知识点:date_format
  • 筛选出成就值在1200到2500之间,uid在上述两个任意一个中,且nick_name能匹配牛客_号。where nick_name like '牛客_号' 知识点:like、
select uid,nick_name,achievement	
from user_info
where nick_name like '牛客_号'
and achievement between 1200 and 2500
and uid in (select uid
    from practice_record
    where date_format(submit_time, '%Y%m')='202109'
union all
     select uid
        from exam_record
        where date_format(submit_time, '%Y%m') = '202109')

Supongo que te gusta

Origin blog.csdn.net/qq_62799214/article/details/127846657
Recomendado
Clasificación