0 Descripción del requisito
nombre_usuario puntuación del curso
usuario1 Chino 89
usuario1 Matemáticas 92
usuario1 Inglés 87
usuario2 Chino 96
usuario2 Matemáticas 84
usuario2 Inglés 99
1. Convertir curso y puntuación en una columna Puntuación
del curso del usuario
usuario1 Chino, Matemáticas, Inglés 89, 92, 87
usuario2 Chino, Matemáticas, Inglés 89, 92, 87
1 Preparación de datos
create table test01 as
select 'user1' as user_name,'语文' as course,89 as score
union all
select 'user1' as user_name,'数学' as course,92 as score
union all
select 'user1' as user_name,'英语' as course,87 as score
union all
select 'user2' as user_name,'语文' as course,96 as score
union all
select 'user2' as user_name,'数学' as course,84 as score
union all
select 'user2' as user_name,'英语' as course,99 as score
2 Análisis de datos
A primera vista, esta pregunta es muy simple, es decir, simplemente convierta varias líneas en una sola, y puede resolverla rápidamente con concat_ws(',', collect_list()), pero el entrevistador parece no estar muy satisfecho con esa respuesta. De hecho, esta pregunta es obligatoria, es necesario convertir varias filas en una columna en el orden de chino, matemáticas e inglés, y el orden es fijo. Los estudiantes que han usado la función collect_list() saben que el resultado general de esta función no está en un orden fijo, por lo que el problema de esta pregunta es cómo convertir varias líneas en una línea de acuerdo con el orden especificado y los valores correspondientes. de los campos también pueden ser consistentes.
El problema de esta pregunta se puede transformar de esta manera. La función collect_list() se puede usar en la función de ventana. Si especificamos el orden después del orden al hacer la conversión, y especificamos el tamaño de la ventana como la ventana de partición completa, ¿Se resolverá el problema? , también porque el chino, las matemáticas y el inglés son cadenas, no podemos obtener la respuesta deseada ordenando directamente, por lo que podemos convertir a través de mayúsculas y minúsculas cuando ordenamos. El SQL es el siguiente
select user_name
, collect_list(score) over (partition by user_name
order by case
when course = '语文' then 1
when course = '数学' then 2
when course = '英语' then 3 end
rows between unbounded preceding and unbounded following) a
, collect_list(course) over (partition by user_name
order by case
when course = '语文' then 1
when course = '数学' then 2
when course = '英语' then 3 end
rows between unbounded preceding and unbounded following) b
from test01
Tenga en cuenta que las filas entre el precedente sin límites y el siguiente sin límites aquí representan la ventana completa.
De acuerdo con los resultados anteriores, podemos obtener la respuesta deseada mediante la deduplicación.El SQL final es el siguiente:
select user_name
, concat_ws(',', max(b)) as course
, concat_ws(',', max(a)) as score
from (select user_name
, collect_list(score) over (partition by user_name
order by case
when course = '语文' then 1
when course = '数学' then 2
when course = '英语' then 3 end
rows between unbounded preceding and unbounded following) a
, collect_list(course) over (partition by user_name
order by case
when course = '语文' then 1
when course = '数学' then 2
when course = '英语' then 3 end
rows between unbounded preceding and unbounded following) b
from test01
) t
group by user_name
2 Resumen
Este artículo resume un método para convertir varias filas en una columna en un orden específico, que es esencialmente la aplicación de funciones de ventana.