Función de ventana de consulta de colmena

Aprenda la función de ventana de la colmena y resúmela por cierto:

Los conjuntos de filas agregados por funciones de agregación ordinarias son grupos, y los conjuntos de filas agregados por funciones de ventanas son ventanas. Por lo tanto, la función de agregación ordinaria solo devuelve un valor por grupo (Agrupar por), mientras que la función de ventana devuelve un valor para cada fila en la ventana. Una comprensión simple es que hay una columna adicional para el resultado de la consulta, que puede ser un valor agregado o un valor ordenado.
Las funciones de ventanas generalmente se dividen en dos categorías, funciones de ventanas agregadas y funciones de ventanas de clasificación .

Directorio

Función de ventana agregada

función de ventana de suma

función de ventana de conteo

función de ventana mínima

función de ventana máxima

función de ventana promedio

función de ventana first_value

función de ventana last_value

función de ventana de retraso

función de ventana principal

Función de ventana NTILE

función de ventana cume_dist

Función de ordenar ventana

Función de ventana RANK, DENSE_RANK, ROW_NUMBER

función de ventana percent_rank


 

 Primero inserte los datos:
 

create table score(
name string,
subject string, 
score int) 
row format delimited fields terminated by "\t";

Datos:

孙悟空	语文	10
孙悟空	数学	12
孙悟空	英语	15
大海	语文	4
大海	数学	7
大海	英语	11
宋宋	语文	22
宋宋	数学	19
宋宋	英语	3
婷婷	语文	21
婷婷	数学	8
婷婷	英语	23

Importe los datos a la tabla de la colmena:

load data local inpath '/home/hive/score.txt' into table score;

Comience a probar:

Función de ventana agregada

 

función de ventana de suma

-- 不加条件,所有的结果作为窗口
select name ,subject,score,
sum(score) over() as sum1
from score;

 

-- 以学科作为窗口的所有行
select name ,subject,score,
sum(score) over(partition by subject) as sum
from score;

 

-- 以学科作为分组,分数排序后,从第一行到当前行(含当前行)的所有行作为窗口
select name ,subject,score,
sum(score) over(partition by subject order by score) as sum
from score;

select name ,subject,score,
sum(score) over() as sum1,
sum(score) over(partition by subject) as sum2,
sum(score) over(partition by subject order by score) as sum3,
-- 由起点到当前行的窗口聚合,和sum3一样
sum(score) over(partition by subject order by score rows between UNBOUNDED PRECEDING and current row) as sum4,
-- 当前行和前面一行的窗口聚合
sum(score) over(partition by subject order by score rows between 1 PRECEDING and current row) as sum5,
-- 当前行和前面一行和后面一行的窗口聚合
sum(score) over(partition by subject order by score rows between 1 PRECEDING AND 1 FOLLOWING) as sum6,
-- 当前和后面所有的行
sum(score) over(partition by subject order by score rows between current row and UNBOUNDED FOLLOWING) as sum7
from score;

 

 

Las filas deben seguir la cláusula Ordenar por para limitar los resultados de la clasificación y utilizar un número fijo de filas para limitar el número de filas de datos en la partición.

Resumen:

  • OVER (): especifique el tamaño de la ventana de datos en la que funciona la función de análisis. El tamaño de esta ventana de datos puede cambiar a medida que cambian las líneas.
  • FILA ACTUAL: fila actual
  • n PRECEDENTE: reenvía n filas de datos
  • n SIGUIENTE: n filas de datos en el futuro
  • SIN LÍMITES: punto de partida, PRECEDENTE SIN LÍMITES significa punto de partida al frente, SIGUIENTE SIN LÍMITES significa punto final en la parte posterior

Nota: n debe ser del tipo int .

función de ventana de conteo

Tome la cantidad de artículos en la ventana

función de ventana mínima

Tome el valor mínimo en la ventana, similar a la función de suma

función de ventana máxima

Tome el valor máximo en la ventana, similar a la función de suma

función de ventana promedio

Tome el valor promedio en la ventana, similar a la función de suma

función de ventana first_value

Devuelve el primer valor en la partición, similar a la función de suma

función de ventana last_value

Devuelve el último valor en la partición, similar a la función de suma

función de ventana de retraso

LAG (col, n, default_val): la enésima fila de datos hacia adelante, col es el nombre de la columna, n es el número de filas hacia arriba y default_val se toma cuando la enésima fila es nula


select name ,subject,score,
 --窗口内 往上取第二个 取不到时赋默认值60
lag(score,2,60) over(partition by subject order by score) as lag1,
 --窗口内 往上取第二个 取不到时赋默认值NULL
lag(score,2) over(partition by subject order by score) as lag2
from score ;

función de ventana principal

LEAD (col, n, default_val): la enésima fila de datos en el futuro, col es el nombre de la columna, n es el número de filas hacia abajo y default_val se toma cuando la enésima fila es nula

select name ,subject,score,
 --窗口内 往下取第二个 取不到时赋默认值60
LEAD(score,2,60) over(partition by subject order by score) as lead1,
 --窗口内 往下取第二个 取不到时赋默认值NULL
LEAD(score,2) over(partition by subject order by score) as lead2
from score ;

Función de ventana NTILE

NTILE (n): distribuya las filas en la partición ordenada al grupo de datos especificado, cada grupo tiene un número, el número comienza desde 1, para cada fila, NTILE devuelve el número del grupo al que pertenece esta fila. Nota: n debe ser del tipo int .

-- 将结果按分数排序并分成4个组
select name ,subject,score, 
ntile(4) over(order by score) sorted
from score;

función de ventana cume_dist

cume_dist () calcula la distribución acumulativa de un valor en una ventana o partición. Suponiendo un orden ascendente, use la siguiente fórmula para determinar la distribución acumulativa: el
número de filas menor o igual que el valor actual x / el número total de filas en la ventana o partición. Donde x es igual al valor en la fila actual de la columna especificada en el orden por cláusula.

select name ,subject,score,
-- 统计小于等于当前分数的人数占总人数的比例
cume_dist() over(order by score) as cume_dist1,
-- 统计分区内小于等于当前分数的人数占总人数的比例
cume_dist() over(partition by subject order by score) as cume_dist3
from score;

 

Explique la primera línea: el
número total de líneas es 12, menor o igual que la primera línea son 3, 4, 7, la relación es 3/12 = 0.25; después de agrupar por materia, hay 4 matemáticas, menor o igual que 7 es solo 7, entonces es 0.25

-- 统计大于等于当前分数的人数占总人数的比例
select name ,subject,score,
cume_dist() over(order by score desc) as cume_dist2
from score;

Función de ordenar ventana

Función de ventana RANK, DENSE_RANK, ROW_NUMBER

RANK () se repetirá cuando el orden sea el mismo, el total no cambiará

DENSE_RANK () se repetirá cuando el pedido sea el mismo, el número total disminuirá

ROW_NUMBER () se calculará de acuerdo con el pedido

Antes de eso, modifique los datos ligeramente:

select name,subject,score,
rank() over(partition by subject order by score desc) rp,
dense_rank() over(partition by subject order by score desc) drp,
row_number() over(partition by subject order by score desc) rmp
from score;

Explicación

Mire las primeras 4 filas, dos 19 puntos, empatados para la primera, la tercera fila de rp es 3, los datos no son menos, drp es 2, ordenados en orden, el número total se reduce y finalmente rmp se ordena por número de filas.

función de ventana percent_rank

Calcule la clasificación porcentual de una fila dada. Se puede usar para calcular el porcentaje de personas que lo exceden. (Valor de clasificación de la fila actual -1) / (número total de filas en el grupo -1)

select name,subject,score,
row_number() over(partition by subject order by score) as row_number,
percent_rank() over(partition by subject order by score) as percent_rank
from score;

 

 

 

 

 

 

 

Publicado 39 artículos originales · ganado elogios 1 · vistas 4620

Supongo que te gusta

Origin blog.csdn.net/thetimelyrain/article/details/104194872
Recomendado
Clasificación