conceitos de função analítica no padrão SQL
uma função analítica calcula valores sobre um grupo de linhas e retorna como resultado único para cada linha. Isto é diferente de uma função agregada,que retorna um único resultado para um grupo de linhas.
uma função analítica inclui uma cláusulaOVER
, que define uma janela de linhas em torno da linha a ser avaliada. Para cada linha, o resultado da função analítica é calculado usando a janela selecionada de linhas como entrada, possível agregação.
com funções analíticas você pode calcular médias móveis, itens rank, somas de cálculo e realizar outras análises.
As seguintes funções podem ser utilizadas como funções analíticas:funções de navegação,funções de numeração e funções analíticas agregadas
sintaxe da função analítica
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
regras de notação
- parêntesis rectos “” indicam cláusulas opcionais.
- parênteses “() ” indicam parênteses literais.
- a barra vertical ” / ” indica um ou lógico.
- Chavetas “{ } ” enclausuram um conjunto de opções.
- uma vírgula seguida de uma elipse entre parênteses rectos “” indica que o item anterior pode repetir-se numa lista separada por vírgulas.
Descrição
uma função analítica calcula os resultados ao longo de um grupo de linhas. Você pode usar a seguinte sintaxe para construir uma função analítica:
-
analytic_function_name
: a função que executa uma operação analítica.Por exemplo, a função de numeraçãoRANK()
pode ser usada aqui. -
argument_list
: argumentos que são específicos para a função analítica.Algumas funções têm-nas, outras não. -
OVER
: Keyword required in the analytic function syntax preceding theOVER
clause. -
over_clause
: referências a janela que define um grupo de linhas numa tabela sobre a qual usar uma função analítica. -
window_specification
: define as especificações para a janela. - : define a janela para a janela.
-
rows_range
: define as linhas físicas ou o intervalo alógico para uma janela.
Notas
Uma função analítica pode aparecer como um escalar expressão operando intwo lugares na consulta:
-
SELECT
lista. Se a função analítica aparecer na listaSELECT
, a sua lista de argumentos eOVER
cláusula não pode referir-se aos pseudónimos introduzidos na mesma lista de selecção. - a cláusula
ORDER BY
. If the analytic function appears in theORDER BY
clause of the query, its argument list can refer toSELECT
list aliases.
uma função analítica não pode referir-se a outra função analítica na sua lista de documentos ou na sua OVER
cláusula, mesmo indirectamente através de um pseudónimo.
uma função analítica é avaliada após agregação. Por exemplo, a cláusulaGROUP BY
e as funções agregadas não analíticas são avaliadas em primeiro lugar.Como funções agregadas são avaliadas antes de funções analíticas, funções agregadas podem ser usadas como operandos de entrada para funções analíticas.
Devolve
um único resultado para cada linha na entrada.
Definindo a cláusula
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
Descrição
OVER
cláusula referências de uma janela que define um grupo de linhas em uma tableupon que usar uma função analítica. Você pode fornecer um named_window
que é definido em sua consulta, ou você pode definir as especificações para uma nova janela.
notas
Se não for fornecida qualquer especificação de janela ou janela, as linhas de produção estão incluídas na janela para cada linha.
Exemplos usando o OVER
cláusula
Estas consultas usar a janela especificações:
- Calcular um total geral
- Calcule o subtotal
- Calcule a soma cumulativa
- Calcular uma média móvel
- Calcule o número de itens dentro de um intervalo
- Obter mais populares item em cada categoria
- Obter o último valor em um intervalo
- Calcule rank
Estas consultas usar um nome de janela:
- obtém o último valor num intervalo
- Use uma janela com nome numa cláusula da janela
definindo a especificação da janela
window_specification: ] ]
descrição
define as especificações da janela.
-
named_window
: O nome de uma janela existente que wasdefined com umWINDOW
cláusula.
-
PARTITION BY
: divide as linhas de entrada em partições separadas, sobre as quais a função analítica é avaliada independentemente.- várias expressões de partição são permitidas na cláusula
PARTITION BY
. - uma expressão não pode conter tipos de vírgula flutuante, tipos não agrupáveis,constantes ou funções analíticas.
- Se esta cláusula opcional não for utilizada, todas as linhas da tabela de entrada imprimem uma única partição.
- várias expressões de partição são permitidas na cláusula
-
ORDER BY
: define como as linhas são ordenadas dentro de uma partição.Esta cláusula é opcional na maioria das situações, mas é necessária em alguns casos para funções de navegação. - : Para funções analíticas agregadas, define a janela dentro da partição atual.A moldura da janela determina o que incluir na janela.Se esta cláusula for utilizada,
ORDER BY
é necessária excepto para Janelas fundidas por completo.
Notes
If neither the ORDER BY
clause nor window frame clause are present,the window frame includes all rows in that partition.
para funções analíticas agregadas, se a cláusula ORDER BY
estiver presente mas a cláusula da janela não estiver, a seguinte cláusula da janela é utilizada por omissão:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Por exemplo, as consultas a seguir são equivalentes:
SELECT book, LAST_VALUE(item) OVER (ORDER BY year)FROM Library
SELECT book, LAST_VALUE(item) OVER ( ORDER BY year RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)FROM Library
as Regras para o uso de um nome de janela em janela de especificação
Se você usar um nome de janela em janela especificações, estas regras se aplicam:
- As especificações na janela com o nome pode ser extendedwith novas especificações que definem a janela de especificação cláusula.não pode ter definições redundantes. Se você tem um
ORDER BY
Claus na janela nomeada e na cláusula de especificação da janela, anerror é lançado.a ordem das cláusulas é importante.PARTITION BY
must come first, followed byORDER BY
and . Se você adicionar uma janela com nome, suas especificações da janela são processadas primeiro.--this works:SELECT item, purchases, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popularFROM ProduceWINDOW item_window AS (ORDER BY purchases)--this does not work:SELECT item, purchases, LAST_VALUE(item) OVER (item_window ORDER BY purchases) AS most_popularFROM ProduceWINDOW item_window AS (ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
-
uma janela com nome e
PARTITION BY
não pode aparecer em conjunto na especificação da janela. Se precisar dePARTITION BY
, adicione-o à janela com nome. -
Você não pode se referir a uma janela nomeada em um
ORDER BY
cláusula, uma consulta externa,ou qualquer subquery.
Exemplos usando a janela de especificação
Estas consultas definir partições em uma função analítica:
- Calcule o subtotal
- Calcule a soma cumulativa
- Obter mais populares item em cada categoria
- Obter o último valor em um intervalo
- Calcule rank
- Use um nome de janela em janela de moldura cláusula
Estas consultas incluem um chamado de janela em janela de especificação:
- obtenha o último valor num intervalo
- Use uma janela com nome numa cláusula de janela
estas consultas definem como as linhas são ordenadas numa partição:
- Calcule o subtotal
- Calcule a soma cumulativa
- Calcular uma média móvel
- Calcule o número de itens dentro de um intervalo
- Obter mais populares item em cada categoria
- Obter o último valor em um intervalo
- Calcule rank
- Usar um nome de janela em janela de moldura cláusula
Definir a moldura da janela cláusula
window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }frame_between: { BETWEEN unbounded_preceding AND frame_end_a | BETWEEN numeric_preceding AND frame_end_a | BETWEEN current_row AND frame_end_b | BETWEEN numeric_following AND frame_end_c }frame_start: { unbounded_preceding | numeric_preceding | }frame_end_a: { numeric_preceding | current_row | numeric_following | unbounded_following }frame_end_b: { current_row | numeric_following | unbounded_following }frame_end_c: { numeric_following | unbounded_following }unbounded_preceding: UNBOUNDED PRECEDINGnumeric_preceding: numeric_expression PRECEDINGunbounded_following: UNBOUNDED FOLLOWINGnumeric_following: numeric_expression FOLLOWINGcurrent_row: CURRENT ROW
A moldura da janela cláusula define a janela de moldura em torno da linha atual withina partição, sobre o qual a função analítica é avaliada.Somente as funções analíticas agregadas podem usar uma cláusula de frame da janela.
-
rows_range
: uma cláusula que define uma janela com linha física ou uma gama lógica.-
ROWS
: calcula a moldura da janela com base em compensações físicas da linha corrente. Por exemplo, você pode incluir duas linhas antes e depois da linha atual. -
RANGE
: calcula a moldura da janela com base num intervalo lógico de linhas em torno da linha actual, com base na linha actualORDER BY
valor-chave.O valor do intervalo fornecido é adicionado ou subtraído ao valor-chave da linha actual para definir um limite de intervalo inicial ou final para a janela da janela. Numa janela baseada em intervalo, deve haver exatamente uma compressão noORDER BY
cláusula, e a expressão deve ter um tipo anumérico.
Dica: Se você quiser usar um intervalo com uma data, use
ORDER BY
com a funçãoUNIX_DATE()
. Se você quiser usar um intervalo com um carimbo de data / hora,use oUNIX_SECONDS()
UNIX_MILLIS()
, ouUNIX_MICROS()
função. -
-
frame_between
: cria uma janela com um limite inferior e superior.O primeiro limite representa o limite inferior. O segundo limite representa o limite superior. Apenas algumas combinações de limites podem ser usadas, como mostra na sintaxe anterior.- Definir o início da moldura da janela com
unbounded_preceding
numeric_preceding
numeric_following
, oucurrent_row
.-
unbounded_preceding
: a janela começa no início da partição. -
numeric_preceding
ounumeric_following
: o início da janela é relativo à linha corrente. -
current_row
: a janela começa na linha actual.
-
- Definir o fim da moldura da janela com
numeric_preceding
numeric_following
current_row
, ouunbounded_following
.-
numeric_preceding
ounumeric_following
: o fim da janela é relativo à linha actual. -
current_row
: A moldura da janela termina na linha actual. -
unbounded_following
: o quadro da janela termina no final dapartição.
-
- Definir o início da moldura da janela com
-
frame_start
: cria uma janela com um limite inferior.A moldura da janela termina na linha actual.-
unbounded_preceding
: a janela começa no início da partição. -
numeric_preceding
: o início da janela é relativo à linha corrente. -
current_row
: a janela começa na linha actual.
-
-
numeric_expression
: Uma expressão que representa um tipo numérico.A expressão numérica deve ser um parâmetro integrador constante, não-negativo.
notas
Se um limite se estende para além do início ou fim de uma partição,a moldura da janela só irá incluir linhas dentro dessa partição.
não pode usar uma cláusula de janela com funções de navegação e funções de numeração, tais como RANK()
.estas consultas calculam valores com ROWS
:
- Calcule a soma cumulativa
- Calcular uma média móvel
- Obter mais populares item em cada categoria
- Obter o último valor em um intervalo
- Use um nome de janela em janela de moldura cláusula
Estas consultas calcular os valores com RANGE
:
- Calcule o número de itens dentro de um intervalo
Estas consultas calcular os valores com um parcial ou totalmente independente janela:
- Calcular um total geral
- Calcule o subtotal
- Calcule a soma cumulativa
- Obter mais populares item em cada categoria
- Calcule rank
Estas consultas calcular os valores numéricos de limites:
- Calcule a soma cumulativa
- Calcular uma média móvel
- Calcule o número de itens dentro de um intervalo
- Obter o último valor em um intervalo
- Use um nome de janela em janela de moldura cláusula
Estas consultas calcular os valores com a linha atual como um limite:
- Compute a grand total
- Compute a subtotal
- Compute a cumulative sum
Referencing a named window
SELECT query_expr, analytic_function_name ( ) OVER over_clauseFROM from_itemWINDOW named_window_expression over_clause: { named_window | ( ) }window_specification: ] ] named_window_expression: named_window AS { named_window | ( ) }
a named window represents a group of rows in a table upon which to use ananalytic function. Um nome de janela é definida emWINDOW
cláusula, e referenciado inan analítica da função OVER
cláusula.Em um OVER
cláusula, uma janela pode aparecer por si mesmo ou embeddedwithin uma janela de especificação.
Exemplos
- Obter o último valor em um intervalo
- Use um nome de janela em janela de moldura cláusula
a função de Navegação conceitos
funções de Navegação geralmente calcular a algumasvalue_expression
sobre uma linha diferente na moldura da janela de thecurrent linha. The OVER
clause syntax varies across navigation functions.
Requisitos para o OVER
cláusula:
-
PARTITION BY
: Opcional. -
ORDER BY
:- Disallowed for
PERCENTILE_CONT
andPERCENTILE_DISC
. - Required for
FIRST_VALUE
LAST_VALUE
NTH_VALUE
LEAD
andLAG
.
- Disallowed for
-
window_frame_clause
:- Disallowed for
PERCENTILE_CONT
PERCENTILE_DISC
LEAD
andLAG
. - Optional for
FIRST_VALUE
LAST_VALUE
, andNTH_VALUE
.
- Disallowed for
Para todas as funções de navegação, o tipo de dados de resultado é o mesmo tipovalue_expression
.
conceitos de função de numeração
funções de numeração atribuem valores inteiros a cada linha com base na sua posição dentro da janela especificada.
Exemplo de RANK()
DENSE_RANK()
e ROW_NUMBER()
:
WITH Numbers AS (SELECT 1 as x UNION ALL SELECT 2 UNION ALL SELECT 2 UNION ALL SELECT 5 UNION ALL SELECT 8 UNION ALL SELECT 10 UNION ALL SELECT 10)SELECT x, RANK() OVER (ORDER BY x ASC) AS rank, DENSE_RANK() OVER (ORDER BY x ASC) AS dense_rank, ROW_NUMBER() OVER (ORDER BY x) AS row_numFROM Numbers+---------------------------------------------------+| x | rank | dense_rank | row_num |+---------------------------------------------------+| 1 | 1 | 1 | 1 || 2 | 2 | 2 | 2 || 2 | 2 | 2 | 3 || 5 | 4 | 3 | 4 || 8 | 5 | 4 | 5 || 10 | 6 | 5 | 6 || 10 | 6 | 5 | 7 |+---------------------------------------------------+
-
RANK()
: Para x = 5,rank
é 4, uma vez queRANK()
incrementos pelo número de pares no grupo de ordenação de janelas anterior. -
DENSE_RANK()
: Para x=5,dense_rank
é 3, poisDENSE_RANK()
alwaysincrements por 1, nunca perder o valor. -
ROW_NUMBER()
: para x=5, is 4.
conceitos de função analítica agregada
uma função agregada é uma função que realiza um cálculo em aset de valores. A maioria das funções agregadas podem ser usadas na função ananalítica. Estas funções agregadas são chamadas Funções analíticas agregadas.
com funções analíticas agregadas, a cláusula OVER
é anexada à chamada de função agregada; a sintaxe da chamada de função permanece inalterada.Como suas contrapartidas de função agregada, estas funções analíticas realizam agregações, mas especificamente sobre o frame de janela relevante para cada linha.Os tipos de dados de resultado destas funções analíticas são os mesmos que os seus homólogos da função theiraggregate.
exemplos de função analítica
nestes exemplos, o item seleccionado é a linha actual. Os boldeditems são as linhas que estão incluídas na análise.
tabelas Comuns usados nos exemplos
as tabelas A seguir são utilizados no subsequente agregação analyticquery exemplos: Produce
Employees
e Farm
.alguns exemplos referenciam uma tabela chamada Produce
:
WITH Produce AS (SELECT 'kale' as item, 23 as purchases, 'vegetable' as category UNION ALL SELECT 'orange', 2, 'fruit' UNION ALL SELECT 'cabbage', 9, 'vegetable' UNION ALL SELECT 'apple', 8, 'fruit' UNION ALL SELECT 'leek', 2, 'vegetable' UNION ALL SELECT 'lettuce', 10, 'vegetable')SELECT * FROM Produce+-------------------------------------+| item | category | purchases |+-------------------------------------+| kale | vegetable | 23 || orange | fruit | 2 || cabbage | vegetable | 9 || apple | fruit | 8 || leek | vegetable | 2 || lettuce | vegetable | 10 |+-------------------------------------+
tabela de Funcionários
Alguns exemplos de referência uma tabela chamada Employees
:
WITH Employees AS (SELECT 'Isabella' as name, 2 as department, DATE(1997, 09, 28) as start_date UNION ALL SELECT 'Anthony', 1, DATE(1995, 11, 29) UNION ALL SELECT 'Daniel', 2, DATE(2004, 06, 24) UNION ALL SELECT 'Andrew', 1, DATE(1999, 01, 23) UNION ALL SELECT 'Jacob', 1, DATE(1990, 07, 11) UNION ALL SELECT 'Jose', 2, DATE(2013, 03, 17))SELECT * FROM Employees+-------------------------------------+| name | department | start_date |+-------------------------------------+| Isabella | 2 | 1997-09-28 || Anthony | 1 | 1995-11-29 || Daniel | 2 | 2004-06-24 || Andrew | 1 | 1999-01-23 || Jacob | 1 | 1990-07-11 || Jose | 2 | 2013-03-17 |+-------------------------------------+
Farm tabela
Alguns exemplos de referência uma tabela chamada Farm
:
WITH Farm AS (SELECT 'cat' as animal, 23 as population, 'mammal' as category UNION ALL SELECT 'duck', 3, 'bird' UNION ALL SELECT 'dog', 2, 'mammal' UNION ALL SELECT 'goose', 1, 'bird' UNION ALL SELECT 'ox', 2, 'mammal' UNION ALL SELECT 'goat', 2, 'mammal')SELECT * FROM Farm+-------------------------------------+| animal | category | population |+-------------------------------------+| cat | mammal | 23 || duck | bird | 3 || dog | mammal | 2 || goose | bird | 1 || ox | mammal | 2 || goat | mammal | 2 |+-------------------------------------+
Calcular um total geral
Este calcula o valor total para todos os itensProduce
tabela.
- (laranja, maçã, alho-porro, repolho, alface, couve) = 54 total de compras
- (laranja, maçã, alho-porro, repolho, alface, couve) = 54 total de compras
- (laranja, maçã, alho-porro, repolho, alface, couve) = 54 total de compras
- (laranja, maçã, alho-porro, repolho, alface, couve) = 54 total de compras
- (laranja, maçã, alho-porro, repolho, alface, couve) = 54 total de compras
- (laranja, maçã, alho-porro, repolho, alface, couve) = 54 total de compras
SELECT item, purchases, category, SUM(purchases) OVER () AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 54 || leek | 2 | vegetable | 54 || apple | 8 | fruit | 54 || cabbage | 9 | vegetable | 54 || lettuce | 10 | vegetable | 54 || kale | 23 | vegetable | 54 |+-------------------------------------------------------+
Calcule o subtotal
Este calcula o subtotal para cada categoriaProduce
table.
- frutas
- (laranja, maçã) = 10 total de compras
- (laranja, maçã) = 10 total de compras
- legumes
- (alho-porro, repolho, alface, couve) = 44 total de compras
- (alho-porro, repolho, alface, couve) = 44 total de compras
- (alho-porro, repolho, alface, couve) = 44 total de compras
- (alho-porro, repolho, alface, couve) = 44 total de compras
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 10 || apple | 8 | fruit | 10 || leek | 2 | vegetable | 44 || cabbage | 9 | vegetable | 44 || lettuce | 10 | vegetable | 44 || kale | 23 | vegetable | 44 |+-------------------------------------------------------+
Calcule a soma cumulativa
Este calcula uma soma cumulativa para cada categoriaProduce
tabela. A soma é calculada em relação ao teórico definido usando a cláusula ORDER BY
.
- frutas
- (laranja, maçã) = 2 total de compras
- (laranja, maçã) = 10 total de compras
- legumes
- (alho-porro, repolho, alface, couve) = 2 total de compras
- (alho-porro, repolho, alface, couve) = 11 total de compras
- (alho-porro, repolho, alface, couve) = 21 total de compras
- (alho-porro, repolho, alface, couve) = 44 total de compras
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 2 || apple | 8 | fruit | 10 || leek | 2 | vegetable | 2 || cabbage | 9 | vegetable | 11 || lettuce | 10 | vegetable | 21 || kale | 23 | vegetable | 44 |+-------------------------------------------------------+
Este faz a mesma coisa que o exemplo anterior. Você não tem que adicionar como um limite, a menos que você gostaria de ler.
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
neste exemplo, todos os itens na tabelaProduce
estão incluídos na partição. Apenas as linhas anteriores são analisadas. A análise inicia dois pontos antes da linha atual na partição.
- (laranja, alho-poró, maçã, couve, alface, couve) = NULL
- (laranja, alho-poró, maçã, couve, alface, couve) = NULL
- (laranja, alho-poró, maçã, couve, alface, couve) = 2
- (laranja, alho-poró, maçã, couve, alface, couve) = 4
- (laranja, alho-poró, maçã, couve, alface, couve) = 12
- (laranja, alho-poró, maçã, couve, alface, couve) = 21
SELECT item, purchases, category, SUM(purchases) OVER ( ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING ) AS total_purchasesFROM Produce;+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | NULL || leek | 2 | vegetable | NULL || apple | 8 | fruit | 2 || cabbage | 9 | vegetable | 4 || lettuce | 10 | vegetable | 12 || kale | 23 | vegetable | 21 |+-------------------------------------------------------+
Calcular uma média móvel
Isto calcula-se uma média móvel Produce
tabela.O limite inferior é 1 linha antes da linha corrente. O limite superior é uma linha a seguir à linha actual.
- (laranja, alho-poró, maçã, couve, alface, couve) = 2 média de compras
- (laranja, alho-poró, maçã, couve, alface, couve) = 4 média de compras
- (laranja, alho-poró, maçã, couve, alface, couve) = 6.3333 média de compras
- (laranja, alho-poró, maçã, couve, alface, couve) = 9 média de compras
- (laranja, alho-poró, maçã, couve, alface, couve) = 14 média de compras
- (laranja, alho-poró, maçã, couve, alface, couve) = 16.5 média de compras
SELECT item, purchases, category, AVG(purchases) OVER ( ORDER BY purchases ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS avg_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | avg_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 2 || leek | 2 | vegetable | 4 || apple | 8 | fruit | 6.33333 || cabbage | 9 | vegetable | 9 || lettuce | 10 | vegetable | 14 || kale | 23 | vegetable | 16.5 |+-------------------------------------------------------+
Calcule o número de itens dentro de um intervalo
Este exemplo obtém o número de animais que têm um semelhante populationcount Farm
tabela.
- (ganso, cão, boi, cabra, pato, gato) = 4 animais entre 0-2.(ganso, cão, boi, cabra, pato, gato) = 5 animais entre a população varia entre 1-3.(ganso, cão, boi, cabra, pato, gato) = 5 animais entre a população varia entre 1-3.(ganso, cão, boi, cabra, pato, gato) = 5 animais entre a população varia entre 1-3.(ganso, cão, boi, cabra, pato, gato) = 4 animais entre a população varia entre 2-4.(ganso, cão, boi, cabra, pato, gato) = 1 animal entre 22-24 habitantes.
SELECT animal, population, category, COUNT(*) OVER ( ORDER BY population RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS similar_populationFROM Farm;+----------------------------------------------------------+| animal | population | category | similar_population |+----------------------------------------------------------+| goose | 1 | bird | 4 || dog | 2 | mammal | 5 || ox | 2 | mammal | 5 || goat | 2 | mammal | 5 || duck | 3 | bird | 4 || cat | 23 | mammal | 1 |+----------------------------------------------------------+
obter o item mais popular em cada categoria
este exemplo obtém o item mais popular em cada categoria. Ele define como as linhas em uma janela são particionadas e ordenadas em cada partição. A tabelaProduce
é referenciada.
- frutas
- (laranja, maçã) = a apple é mais populares
- (laranja, maçã) = a apple é mais populares
- legumes
- (alho-porro, repolho, alface, couve) = couve é mais populares
- (alho-porro, repolho, alface, couve) = couve é mais populares
- (alho-porro, repolho, alface, couve) = couve é mais populares
- (alho-porro, repolho, alface, couve) = couve é mais populares
SELECT item, purchases, category, LAST_VALUE(item) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS most_popularFROM Produce+----------------------------------------------------+| item | purchases | category | most_popular |+----------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | kale || cabbage | 9 | vegetable | kale || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+----------------------------------------------------+
Obter o último valor em um intervalo
Este exemplo obtém os mais populares item em uma janela específica de quadros, usingthe Produce
tabela. A moldura da janela analisa até três de cada vez. Veja de perto a coluna demost_popular
para os produtos hortícolas.Em vez de obter o item mais popular em uma categoria específica, ele recebe o item mais popular em uma faixa específica nessa categoria.
- frutas
- (laranja, maçã) = a apple é mais populares
- (laranja, maçã) = a apple é mais populares
- legumes
- (alho-porro, repolho, alface, couve) = repolho é mais populares
- (alho-porro, repolho, alface, couve) = alface é mais populares
- (alho-porro, repolho, alface, couve) = couve é mais populares
- (alho-porro, repolho, alface, couve) = couve é mais populares
SELECT item, purchases, category, LAST_VALUE(item) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM Produce+----------------------------------------------------+| item | purchases | category | most_popular |+----------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | cabbage || cabbage | 9 | vegetable | lettuce || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+----------------------------------------------------+
Este exemplo retorna os mesmos resultados como o exemplo anterior, mas includesa chamado de janela de chamada item_window
. Algumas das especificações da janela são definidas diretamente na cláusula OVER
e algumas são definidas na janela nomeada.
SELECT item, purchases, category, LAST_VALUE(item) OVER ( item_window ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM ProduceWINDOW item_window AS ( PARTITION BY category ORDER BY purchases)
Compute rank
Este exemplo calcula a classificação de cada empregado dentro do seu departamento,com base na sua data de início. A especificação da janela é definida directamente na cláusula OVER
. A tabela Employees
é referenciada.
- departamento 1
- (Jacob, Anthony Andrew) = Atribuir uma classificação de 1 a Jacó
- (Jacob, Anthony Andrew) = Atribuir uma classificação 2 de Anthony
- (Jacob, Anthony Andrew) = Atribuir uma classificação 3 Andrew
- departamento 2
- (Isabella, Daniel, Jose) = Atribuir uma classificação de 1 a Isabella
- (Isabella, Daniel, José) = Atribuir uma classificação de 2 a Daniel
- (Isabella, Daniel, José) = Atribuir uma classificação 3 Jose
SELECT name, department, start_date, RANK() OVER (PARTITION BY department ORDER BY start_date) AS rankFROM Employees;+--------------------------------------------+| name | department | start_date | rank |+--------------------------------------------+| Jacob | 1 | 1990-07-11 | 1 || Anthony | 1 | 1995-11-29 | 2 || Andrew | 1 | 1999-01-23 | 3 || Isabella | 2 | 1997-09-28 | 1 || Daniel | 2 | 2004-06-24 | 2 || Jose | 2 | 2013-03-17 | 3 |+--------------------------------------------+
Use um nome de janela em janela de moldura cláusula
Você pode definir alguns de seus lógica em uma chamada de janela e algumas delas em uma cláusula de enquadramento da janela. Esta lógica é combinada. Aqui está um exemplo, usando a tabelaProduce
.
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window) AS most_popularFROM ProduceWINDOW item_window AS ( PARTITION BY category ORDER BY purchases ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)+-------------------------------------------------------+| item | purchases | category | most_popular |+-------------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | lettuce || cabbage | 9 | vegetable | kale || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+-------------------------------------------------------+
Você também pode obter os resultados anteriores com estes exemplos:
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window) AS most_popularFROM ProduceWINDOW a AS (PARTITION BY category), b AS (a ORDER BY purchases), c AS (b ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING), item_window AS (c)
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popularFROM ProduceWINDOW a AS (PARTITION BY category), b AS (a ORDER BY purchases), item_window AS (b)
O exemplo a seguir gera um erro devido a um quadro de janela cláusula beendefined duas vezes:
SELECT item, purchases, category, LAST_VALUE(item) OVER ( item_window ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM ProduceWINDOW item_window AS ( ORDER BY purchases ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Leave a Reply