Função de agregação SQL HIVE e linhas entre / intervalo entre explicação detalhada

1. Uso de linhas entre e intervalo entre

1. Análise de palavras-chave relacionadas

unbounded 无边界
preceding 往前
following 往后
unbounded preceding 往前所有行,即初始行
n preceding 往前n行
unbounded following 往后所有行,即末尾行
n following 往后n行
current row 当前行

语法
(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING

2. linhas entre ... e ...

linhas: Refere-se ao intervalo do quadro determinado pelo número da linha, que é uma linha no sentido físico.

Por exemplo, as linhas entre 1 anterior e 1 seguinte representam uma linha antes e uma linha após a linha atual.

3. variam entre ... e ...

intervalo: refere-se ao valor da linha atual na função da janela como base, depois classifica de acordo com a ordem e, finalmente, adiciona e subtrai os limites superior e inferior de acordo com o intervalo. é uma linha lógica.

Por exemplo, sum(score) over (PARTITION by id order by score ENTRE 1 PRECEDING AND 1 FOLLOWING) significa agrupar por id, classificar por pontuação em ordem crescente e, em seguida, obter a pontuação da linha atual, subtrair um do limite inferior e adicionar um ao limite superior, como um intervalo, e somar as pontuações nesse intervalo.

É meio complicado, então vamos ver um exemplo para entender.

Dois, exemplos

1. Preparação de dados

Suponha que haja uma tabela datadev.t_student, os dados são os seguintes

eu ia pontuação
stu_1 1
stu_1 2
stu_1 3
stu_1 4
stu_1 5
stu_1 5

2. Teste  as linhas entre ... e ...

SELECT id, score,
sum(score) over (PARTITION by id) as a1,
sum(score) over (PARTITION by id order by score) as a2,
sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as a3,
sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as a4,
sum(score) over (PARTITION by id order by 1) as a5
from datadev.t_student;

Os resultados do teste são os seguintes:

analisar:

  1. sum(score) over (PARTITION by id) as a1: agrupe por id e some diretamente as pontuações, que é o mais familiar para todos
  2. sum(score) over (PARTITION by id order by score) as a2: Ordena by score and add up from the start row to the current row. Semelhante ao conceito de classificação.
  3. sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW): soma da linha inicial até a linha atual. Ao contrário de a2, quando a pontuação é a mesma, as classificações são diferentes e não serão somadas à linha atual. Semelhante ao conceito de row_number.
  4. sum(score) over (PARTITION by id order by score ROWS ENTRE UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING): soma da linha inicial até a linha final, o mesmo que a1.
  5. sum(score) over (PARTITION by id order by 1): A função é a mesma de a2, onde order by 1 é equivalente à mesma pontuação, então todos são somados.

As explicações de a1 e a2 no site oficial são as seguintes:

  • Quando ORDER BY é especificado com a cláusula WINDOW ausente, o padrão da especificação WINDOW é RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
  • Quando as cláusulas ORDER BY e WINDOW estão ausentes, a especificação WINDOW assume como padrão ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

Portanto, a1 e a2 são equivalentes a

SELECT id, score,
sum(score) over (PARTITION by id) as a1,
sum(score) over (PARTITION by id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as a1,
sum(score) over (PARTITION by id order by score) as a2,
sum(score) over (PARTITION by id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as a2,
from datadev.t_student;

 O endereço do site oficial é o seguinte:

LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundation

3. Teste  o intervalo entre ... e ...

SELECT id, score,
sum(score) over (PARTITION by id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as b1,
sum(score) over (PARTITION by id order by score RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING) as b2
from datadev.t_student;

Os resultados do teste são os seguintes:

 analisar:

  1. sum(score) over (PARTITION by id order by score RANGE ENTRE UNBOUNDED PRECEDING AND UNBOUNDED SEGUING): INTERVALO ENTRE UNBOUNDED PRECEDING E UNBOUNDED FOLLOWING 是默认值,可不写。
  2. sum(score) over (PARTITION by id order by score ENTRE 1 PRECEDING AND UNBOUNDED SEGUING): agrupe por id, classifique em ordem crescente de pontuação e reduza o limite inferior da pontuação da linha atual em um, e o limite superior é tudo (que pode ser considerado infinito), como o intervalo de filtragem. Por fim, adicione as pontuações que atendem ao intervalo de triagem.

A análise do processo de operação de b2 é a seguinte:

eu ia pontuação processo de operação Operação b2
stu_1 1 [valor da pontuação da linha atual - 1, ∞] ==> ou seja, [0, ∞] 1+2+3+4+5+5=20 20
stu_1 2 [valor da pontuação da linha atual - 1, ∞] ==> ou seja [1, ∞] 1+2+3+4+5+5=20 20
stu_1 3 [valor da pontuação da linha atual - 1, ∞] ==> ou seja [2, ∞] 2+3+4+5+5=19 19
stu_1 4 [valor da pontuação da linha atual - 1, ∞] ==> ou seja [3, ∞] 3+4+5+5=17 17
stu_1 5 [valor da pontuação da linha atual - 1, ∞] ==> ou seja [4, ∞] 4+5+5=14 14
stu_1 5 [valor da pontuação da linha atual - 1, ∞] ==> ou seja [4, ∞] 4+5+5=14 14

4. Compare  o intervalo entre ... e ... e as linhas entre ... e ...

SELECT id, score,
sum(score) over (PARTITION by id order by score RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) as a,
sum(score) over (PARTITION by id order by score ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as b
from datadev.t_student;

Os resultados do teste são os seguintes:

 analisar:

eu ia pontuação processo de operação de alcance operação de alcance a(alcance) processo de operação de linhas operação de linhas b(linhas)
stu_1 1 [valor da pontuação da linha atual - 1, valor da pontuação da linha atual + 1] ==> ou seja, [0, 2] 1+2=3 3
Adicione a pontuação da linha anterior e a próxima linha da linha atual
1+2=3 3
stu_1 2 [valor da pontuação da linha atual - 1, valor da pontuação da linha atual + 1] ==> ou seja, [1, 3] 1+2+3=6 6
Adicione a pontuação da linha anterior e a próxima linha da linha atual
1+2+3=6 6
stu_1 3 [valor da pontuação da linha atual - 1, valor da pontuação da linha atual + 1] ==> ou seja, [2, 4] 2+3+4=9 9
Adicione a pontuação da linha anterior e a próxima linha da linha atual
2+3+4=9 9
stu_1 4 [valor da pontuação da linha atual - 1, valor da pontuação da linha atual + 1] ==> ie [3, 5] 3+4+5+5=17 17
Adicione a pontuação da linha anterior e a próxima linha da linha atual
3+4+5=12 12
stu_1 5 [valor da pontuação da linha atual - 1, valor da pontuação da linha atual + 1] ==> ie [4, 6] 4+5+5=14 14
Adicione a pontuação da linha anterior e a próxima linha da linha atual
4+5+5=14 14
stu_1 5 [valor da pontuação da linha atual - 1, valor da pontuação da linha atual + 1] ==> ie [4, 6] 4+5+5=14 14
Adicione a pontuação da linha anterior e a próxima linha da linha atual
5+5=10 10

Documentação de referência: Hive Windows e funções analíticas

Acho que você gosta

Origin blog.csdn.net/qq_37771475/article/details/121774383
Recomendado
Clasificación