Entrevista con la función de ventana SQL más frecuente

imagen

preguntas de entrevista

Hay una "tabla de calificación del estudiante", que contiene 4 campos: identificación de la clase, identificación del estudiante, identificación del curso, calificaciones.

inserte la descripción de la imagen aquí

Pregunta 1: Encuentra los tres registros con las calificaciones más altas para cada estudiante

Problema 2: Encuentra los estudiantes cuyas calificaciones son más altas que el promedio de la clase en cada curso

actualización de tecnología

La tecnología debe aprender a compartir y comunicar, y no se recomienda trabajar a puerta cerrada. Una persona puede ir rápido, un grupo de personas puede ir más lejos.

Aquí estoy clasificando una colección de preguntas de entrevistas de análisis de datos. Además, el código fuente, la información, los datos y las mejoras de intercambio técnico en el artículo se pueden obtener agregando el grupo de intercambio del planeta del conocimiento. Los miembros del grupo tienen más de 2,000 personas. Al agregar, recuerde agregar notas: Fuente + dirección de interés, fácil de encontrar amigos de ideas afines.

Método ①, agregar cuenta de WeChat: pythoner666, comentarios: de CSDN + preguntas de la entrevista
Método ②, cuenta oficial de búsqueda de WeChat: aprendizaje de Python y extracción de datos, respuesta en segundo plano: agregar grupo

【Pasos para resolver el problema】

1. problema topN

La pregunta 1 es un problema de clasificación común (problema topN), y es necesario pensar en usar funciones de ventana SQL para resolver tales problemas comerciales.

Hay tres tipos de orden obtenidos por la función de ventana: rank(), dense_rank() y row_number().

También está ordenado por "valor" de pequeño a grande. Las diferencias entre los tres son las siguientes:

inserte la descripción de la imagen aquí

De acuerdo con la descripción del problema, deberíamos usar la función de ventana dense_rank

select *
from (
select *,
       dense_rank() over (partition by 班级id,学生id 
       order by 成绩 desc) as 顺序
from 学生成绩表
) t1
where 顺序 <= 3;

resultado de búsqueda:

inserte la descripción de la imagen aquí

2. Análisis resumido

La pregunta 2 pide averiguar los estudiantes cuyas calificaciones de cada curso son más altas que el promedio de la clase, que se pueden desglosar en las siguientes preguntas:

1) Encuentra el puntaje promedio de cada clase y cada curso

2) Restar la calificación del estudiante de cada curso del puntaje promedio del curso correspondiente en la clase, si el resultado es mayor a 0, significa que la calificación del estudiante en este curso es mayor que el puntaje promedio del curso

3) "Descubrir los estudiantes cuyas calificaciones del curso son más altas que el promedio de la clase" significa que para los estudiantes, el "resultado de resta" más pequeño es mayor que 0

Primero, use el análisis de resumen para encontrar el puntaje promedio de cada clase y cada curso.

select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id;

resultado de búsqueda:

inserte la descripción de la imagen aquí

3. Únase a varias mesas

Cuando se trata de consultas de tablas múltiples, se requieren uniones de tablas múltiples.

El propósito aquí es "restar la calificación del estudiante para cada curso del puntaje promedio del curso correspondiente en la clase".

Por tanto, se trata de unir la "tabla de notas del alumno" original con la "nota media de la clase".

Para mantener todos los datos en la tabla de la izquierda "tabla de calificaciones de los estudiantes", las calificaciones de todos los estudiantes se restan del "promedio del curso" x, así que elija "unión izquierda (unión izquierda)".

inserte la descripción de la imagen aquí

select t1.班级id,t1.学生id,t1.课程id,t1.成绩,
       t1.成绩 - t2.课程平均分 as 相减结果
from 学生成绩表 t1
left join (
select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id
) t2 on t1.班级id = t2.班级id and t1.课程id = t2.课程id;

inserte la descripción de la imagen aquí

Finalmente, use el resumen del grupo y combine la condición de tener para filtrar a los estudiantes cuyo "valor mínimo del resultado de la resta es mayor que 0".

select 班级id,学生id
from (
select t1.班级id,t1.学生id,t1.课程id,t1.成绩,
       t1.成绩 - t2.课程平均分 as 相减结果
from 学生成绩表 as t1
left join (
select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id
) as t2 on t1.班级id = t2.班级id and t1.课程id = t2.课程id
) as tmp
group by 班级id,学生id
having min(相减结果) > 0;

inserte la descripción de la imagen aquí

Puntos de prueba para esta pregunta

1. Examine la comprensión de la agrupación y el resumen, y utilícelo de manera flexible para resolver problemas comerciales;

2. Examinar la comprensión de las uniones de varias tablas y utilizarlas de manera flexible para resolver problemas comerciales;

3) Examine la comprensión de las funciones de ventana. Solo hay unos pocos problemas clásicos resueltos por funciones de ventana. Si los escribe, puede resolver el 99% de los problemas comerciales.

Supongo que te gusta

Origin blog.csdn.net/m0_59596937/article/details/130298507
Recomendado
Clasificación