Analista de datos ---- Fortalecimiento de SQL (2)

Analista de datos ---- Fortalecimiento de SQL (2)

Tema 1: Implementación del procesamiento de texto con SQL

Tabla de información de la hoja de prueba existente exam_info (exam_id ID de la hoja de prueba, etiqueta categoría de la hoja de prueba, dificultad dificultad de la hoja de prueba, duración duración de la prueba) Un
inserte la descripción de la imagen aquí
estudiante que registró la hoja de prueba cometió un error e ingresó parte de la etiqueta de categoría de prueba, dificultad y duración en el campo de la etiqueta al mismo tiempo.
Ayude a encontrar la salida de estos registros registrados incorrectamente y envíelos de acuerdo con el tipo de columna correcto después de dividirlos.
El resultado de los datos de muestra es el siguiente:
inserte la descripción de la imagen aquí
Crear tabla

drop table if exists examination_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;
INSERT INTO examination_info(exam_id,tag,difficulty,duration,release_time) VALUES
  (9001, '算法', 'hard', 60, '2020-01-01 10:00:00'),
  (9002, '算法', 'hard', 80, '2020-01-01 10:00:00'),
  (9003, 'SQL', 'medium', 70, '2020-01-01 10:00:00'),
  (9004, '算法,medium,80','', 0, '2020-01-01 10:00:00');

Análisis del significado de la pregunta:
a través del significado de la pregunta, podemos entender que lo principal que se debe hacer es llenar la línea incorrecta con datos y dividir la cadena, de modo que los datos correctos se puedan colocar en el campo correspondiente.

select  exam_id,
substring_index(tag,",",1) tag,
substring_index(substring_index(tag,",",-2),",",1) difficulty,
substring_index(tag,",",-1) duration
from examination_info
where difficulty=''

Puntos de conocimiento involucrados:
división de cadenas:substring_index(str, delim, count)

nombre del parámetro explicar
calle la cuerda para dividir
comparto Delimitador, dividido por un carácter
contar Cuando count es un número positivo, se toman todos los caracteres antes del n-ésimo delimitador; cuando count es negativo, se toman todos los caracteres después del último n-ésimo delimitador.

Se puede anidar

También puede usar regexp_substrfunciones para dividir usando expresiones regulares

Tema 2: Todas las canciones con los tres idiomas más reproducidos

Tabla de canciones: reproducción de canciones
inserte la descripción de la imagen aquí
Tabla de idiomas: languageid
inserte la descripción de la imagen aquí
Crear tabla:

drop table if exists  songplay;
create table `songplay`(
`id` int,
`playcnt` int,
`languageid` int
);
insert into songplay values(1,85001,1);
insert into songplay  values(2,80001,2);
insert into  songplay  values(3,60001,2);
insert into  songplay values(4,90001,1);
insert into  songplay values(5,69001,1);
insert into  songplay values(6,85001,1);
insert into  songplay values(7,70001,1);

drop table if exists language;
create table `language`(
`id` int,
`name` varchar(255)
);
insert into  language  values(1,'中文');
insert into  language values(2,'英文');

Análisis del significado de la pregunta:
La pregunta es consultar todas las canciones con mayor volumen de reproducción en diferentes idiomas, cuando el volumen de reproducción es el mismo, la clasificación es la misma, por lo que en este momento, es necesario considerar usar la función de establecer el ranking primero, y finalmente dense_ranktomar el ranking de cada una de las 3 mejores canciones.

La función DENSE_RANK() ordena los números de serie en paralelo y no omite los números de serie repetidos, como los números de serie 1, 1, 2

select language_name,songid,playcnt
from (
	select s.id songid,
	l.name language_name,s.playcnt,
	# 关键
	dense_rank() over(partition by name order by s.playcnt desc) rank_num
	from songplay s join language l
	on s.languageid = l.id
	# 排序
	order by l.id
) tmp
where rank_num<4

Tenga en cuenta que hay un requisito oculto en este tema, es decir, el orden de los idiomas devueltos debe ser coherente con el orden de aparición en la tabla de idiomas, por lo que necesitaorder by l.id

Interpretación del código clave:

dense_rank() over(partition by name order by s.playcnt desc) rank_num

Utilice la función de ventana dense_rank()para no omitir la ordenación por número de serie, agrupar por y ordenar en orden descendente
partition by namesegúnname
order by s.playcnt descs.playcnt

Resumir:

Esta vez, las dos preguntas de la prueba SQL son relativamente básicas. La pregunta 1 examina principalmente substring_indexla aplicación de funciones, y la pregunta 2 examina la aplicación de dense_rank()la neutralización de funciones de ventana over().

Supongo que te gusta

Origin blog.csdn.net/qq_52007481/article/details/130170086
Recomendado
Clasificación