Analista de datos ---- Fortalecimiento de SQL (2)
Directorio de artículos
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
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:
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_substr
funciones para dividir usando expresiones regulares
Tema 2: Todas las canciones con los tres idiomas más reproducidos
Tabla de canciones: reproducción de canciones
Tabla de idiomas: languageid
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_rank
tomar 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 necesita
order 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 name
segúnname
order by s.playcnt desc
s.playcnt
Resumir:
Esta vez, las dos preguntas de la prueba SQL son relativamente básicas. La pregunta 1 examina principalmente substring_index
la aplicación de funciones, y la pregunta 2 examina la aplicación de dense_rank()
la neutralización de funciones de ventana over()
.