Preguntas de la entrevista de SQL: convierta varias filas en una columna de acuerdo con el orden especificado

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.

Supongo que te gusta

Origin blog.csdn.net/godlovedaniel/article/details/126661848
Recomendado
Clasificación