Conceptos de funciones analíticas en SQL estándar
Una función analítica calcula valores sobre un grupo de filas y devuelve un resultado único para cada fila. Esto es diferente de una función de agregado, que devuelve un único resultado para un grupo de filas.
Una función analítica incluye una cláusula OVER
, que define una ventana de filas alrededor de la fila que se está evaluando. Para cada fila, el resultado de la función analítica se calcula utilizando la ventana de filas seleccionada como entrada, haciendo posible la agregación.
Con las funciones analíticas puede calcular medias móviles, clasificar elementos, calcular sumas acumulativas y realizar otros análisis.
Las siguientes funciones se pueden utilizar como funciones analíticas:funciones de navegación,funciones de numeración y funciones analíticas agregadas
Sintaxis de funciones analíticas
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
Reglas de notación
- Corchetes «» indican cláusulas opcionales.
- Paréntesis «() » indican paréntesis literales.
- La barra vertical » | » indica un OR lógico.
- Llaves «{} » encierran un conjunto de opciones.
- Una coma seguida de puntos suspensivos entre corchetes «» indica que el elemento precedente puede repetirse en una lista separada por comas.
Descripción
Una función analítica calcula los resultados sobre un grupo de filas. Puede utilizar la siguiente sintaxis para crear una función analítica:
-
analytic_function_name
: La función que realiza una operación analítica.Por ejemplo, la función de numeraciónRANK()
podría utilizarse aquí. -
argument_list
: Argumentos específicos de la función analítica.Algunas funciones las tienen, otras no. -
OVER
: Palabra clave requerida en la sintaxis de la función analítica que precede a la cláusulaOVER
. -
over_clause
: Hace referencia a una ventana que define un grupo de filas en una tabla en la que usar una función analítica. -
window_specification
: Define las especificaciones de la ventana. -
window_frame_clause
: Define el marco de ventana para la ventana. -
rows_range
: Define las filas físicas o el rango alógico de un marco de ventana.
Notas
Una función analítica puede aparecer como un operando de expresión escalar en dos lugares de la consulta:
- La lista
SELECT
. Si la función analítica aparece en la listaSELECT
, su lista de argumentos y la cláusulaOVER
no pueden hacer referencia a los alias introducidos en la misma lista de selección. - La cláusula
ORDER BY
. Si la función analítica aparece en la cláusulaORDER BY
de la consulta, su lista de argumentos puede hacer referencia a los alias de la listaSELECT
.
Una función analítica no puede hacer referencia a otra función analítica en su lista de argumentos ni a su cláusula OVER
, ni siquiera indirectamente a través de un alias.
Una función analítica se evalúa después de la agregación. Por ejemplo, la cláusulaGROUP BY
y las funciones agregadas no analíticas se evalúan primero.Debido a que las funciones agregadas se evalúan antes que las funciones analíticas,las funciones agregadas se pueden usar como operandos de entrada para funciones analíticas.
Devuelve
Un único resultado para cada fila de la entrada.
Definir la cláusula OVER
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
Descripción
La cláusula OVER
hace referencia a una ventana que define un grupo de filas en una tabla para usar una función analítica. Puede proporcionar unnamed_window
que esté definido en su consulta, o puede definir las especificaciones para una nueva ventana.
Notas
Si no se proporciona una ventana con nombre ni una especificación de ventana, las filas allinput se incluyen en la ventana para cada fila.
Ejemplos que utilizan la cláusula OVER
Estas consultas utilizan especificaciones de ventana:
- Calcular un total general
- Calcular un subtotal
- Calcular una suma acumulativa
- Calcular una media móvil
- Calcular el número de elementos dentro de un rango
- Obtener el elemento más popular de cada categoría
- Obtener el último valor de un rango
- Calcular rango
Estas consultas usan una ventana con nombre:
- Obtener el último valor de un rango
- Usar una ventana con nombre en una cláusula de marco de ventana
Definir la especificación de la ventana
window_specification: ] ]
Descripción
Define las especificaciones de la ventana.
-
named_window
: El nombre de una ventana existente que se definió con una cláusulaWINDOW
.
-
PARTITION BY
: Divide las filas de entrada en particiones separadas, sobre las que la función analítica se evalúa de forma independiente.- Se permiten múltiples expresiones de partición en la cláusula
PARTITION BY
. - Una expresión no puede contener tipos de coma flotante, tipos no agrupables,constantes o funciones analíticas.
- Si no se utiliza esta cláusula opcional, todas las filas de la tabla de entrada constituyen una sola partición.
- Se permiten múltiples expresiones de partición en la cláusula
-
ORDER BY
: Define cómo se ordenan las filas dentro de una partición.Esta cláusula es opcional en la mayoría de las situaciones, pero se requiere en algunos casos para las funciones de navegación. -
window_frame_clause
: Para funciones analíticas agregadas, define el marco de ventana dentro de la partición actual.El marco de la ventana determina qué incluir en la ventana.Si se utiliza esta cláusula, se requiereORDER BY
, excepto para ventanas con límites completos.
Notas
Si ni la cláusula ORDER BY
ni la cláusula marco de ventana están presentes,el marco de ventana incluye todas las filas de esa partición.
Para funciones analíticas agregadas, si la cláusula ORDER BY
está presente, pero la cláusula marco de ventana no lo está, la siguiente cláusula marco de ventana se utiliza de forma predeterminada:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Por ejemplo, las siguientes consultas son 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
Reglas para usar una ventana con nombre en la especificación de ventana
Si usa una ventana con nombre en sus especificaciones de ventana, se aplican estas reglas:
- Las especificaciones de la ventana con nombre se pueden ampliar con nuevas especificaciones que defina en la cláusula de especificación de ventana.
- No puede tener definiciones redundantes. Si tiene una cláusula
ORDER BY
en la ventana con nombre y la cláusula de especificación de ventana, se lanza un error. -
El orden de las cláusulas importa.
PARTITION BY
debe venir en primer lugar,seguido porORDER BY
ywindow_frame_clause
. Si agrega una ventana con nombre, sus especificaciones de ventana se procesan primero.--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)
-
Una ventana con nombre y
PARTITION BY
no pueden aparecer juntas en la especificación de ventana. Si necesitaPARTITION BY
, agréguelo a la ventana con nombre. -
No se puede hacer referencia a una ventana con nombre en una cláusula
ORDER BY
, una consulta externa o cualquier subconsulta.
Ejemplos usando la especificación de ventana
Estas consultas definen particiones en una función analítica:
- Calcular un subtotal
- Calcular una suma acumulativa
- Obtener el elemento más popular de cada categoría
- Obtener el último valor en un rango
- Calcular rango
- Usar una ventana con nombre en una cláusula de marco de ventana
Estas consultas incluyen una ventana con nombre en una especificación de ventana:
- Obtener el último valor de un rango
- Usar una cláusula de ventana con nombre en un marco de ventana
Estas consultas definen cómo se ordenan las filas en una partición:
- Calcular un subtotal
- Calcular una suma acumulativa
- Calcular una media móvil
- Calcular el número de elementos dentro de un rango
- Obtener el elemento más popular de cada categoría
- Obtener el último valor en un rango
- Calcular rango
- Utilizar una ventana con nombre en una cláusula de marco de ventana
Definir la cláusula de marco de ventana
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
La cláusula marco de ventana define el marco de ventana alrededor de la fila actual dentro de una partición, sobre la que se evalúa la función analítica.Solo las funciones analíticas agregadas pueden usar una cláusula de marco de ventana.
-
rows_range
: Una cláusula que define un marco de ventana con filas físicas o un rango lógico.-
ROWS
: Calcula el marco de la ventana en función de las compensaciones físicas de la fila actual. Por ejemplo, puede incluir dos filas antes y después de la fila actual. -
RANGE
: Calcula el marco de ventana en función de un rango lógico de filas alrededor de la fila actual, en función del valor de claveORDER BY
de la fila actual.El valor de rango proporcionado se agrega o resta al valor de la fila actual para definir un límite de rango inicial o final para el marco de ventana. En un marco de ventana basado en rango, debe haber exactamente una expresión en la cláusulaORDER BY
, y la expresión debe tener tipo anumerico.
Consejo: Si desea utilizar un rango con una fecha, utilice
ORDER BY
con la funciónUNIX_DATE()
. Si desea utilizar un rango con una marca de tiempo,utilice la funciónUNIX_SECONDS()
UNIX_MILLIS()
, oUNIX_MICROS()
. -
-
frame_between
: Crea un marco de ventana con un límite inferior y superior.El primer límite representa el límite inferior. El segundo límite representa el límite superior. Solo se pueden usar ciertas combinaciones de límites, como se muestra en la sintaxis anterior.- Definir el principio del marco de la ventana con la etiqueta
unbounded_preceding
numeric_preceding
numeric_following
ocurrent_row
.-
unbounded_preceding
: El marco de la ventana comienza al principio de la partición. -
numeric_preceding
ornumeric_following
: El inicio del marco de la ventana es relativo a la fila actual. -
current_row
: el marco de La ventana, comienza en la fila actual.
-
- Definir el final del marco de la ventana con la etiqueta
numeric_preceding
numeric_following
current_row
ounbounded_following
.-
numeric_preceding
onumeric_following
: el final de La windowframe es relativo a la fila actual. -
current_row
: El marco de la ventana termina en la fila actual. -
unbounded_following
: El marco de la ventana termina al final de la partición.
-
- Definir el principio del marco de la ventana con la etiqueta
-
frame_start
: Crea un marco de la ventana con un límite inferior.El marco de la ventana termina en la fila actual.-
unbounded_preceding
: El marco de la ventana comienza al principio de la partición. -
numeric_preceding
: El inicio del marco de ventana es relativo a la fila actual. -
current_row
: el marco de La ventana, comienza en la fila actual.
-
-
numeric_expression
: Una expresión que representa un tipo numérico.La expresión numérica debe ser un parámetro de enteros constante y no negativo.
Notas
Si un límite se extiende más allá del principio o el final de una partición,el marco de ventana solo incluirá filas de esa partición.
No puede usar una cláusula de marco de ventana con funciones de navegación y funciones de numeración, como RANK()
.
Ejemplos que utilizan la cláusula marco de ventana
Estas consultas calculan valores con ROWS
:
- Calcular una suma acumulativa
- Calcular una media móvil
- Obtener el elemento más popular de cada categoría
- Obtener el último valor de un rango
- Utilizar una ventana con nombre en una cláusula de marco de ventana
Estas consultas calcular valores con RANGE
:
- Calcular el número de elementos un rango
Estas consultas computan valores con una ventana parcial o totalmente desunida:
- Calcular un total general
- Calcular un subtotal
- Calcular una suma acumulativa
- Obtener el elemento más popular de cada categoría
- Calcular rango
Estas consultas calculan valores con límites numéricos:
- Calcular una suma acumulativa
- Calcular una media móvil
- Calcular el número de elementos dentro de un rango
- Obtenga el último valor de un rango
- Use una cláusula de ventana con nombre en un marco de ventana
Estas consultas calculan los valores con la fila actual como límite:
- Calcular un total general
- Calcular un subtotal
- Calcular una suma acumulativa
Hacer referencia a una ventana con nombre
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 | ( ) }
Una ventana con nombre representa un grupo de filas en una tabla sobre las que usar una función ananalítica. Una ventana con nombre se define en la cláusulaWINDOW
, y se hace referencia a la función analítica OVER
clause.In una cláusula OVER
, una ventana con nombre puede aparecer por sí misma o incrustada dentro de una especificación de ventana.
Ejemplos
- Obtener el último valor de un rango
- Usar una cláusula de ventana con nombre en un marco de ventana
Conceptos de función de navegación
Las funciones de navegación generalmente calculan algo devalue_expression
sobre una fila diferente en el marco de ventana de la fila actual. La sintaxis de la cláusula OVER
varía según las funciones de navegación.
Requisitos para el 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 las funciones de navegación, el tipo de datos de resultado es el mismo quevalue_expression
.
Conceptos de función de numeración
Las funciones de numeración asignan valores enteros a cada fila en función de su posición dentro de la ventana especificada.
Ejemplo RANK()
DENSE_RANK()
y 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
es 4, ya queRANK()
incrementa el número de pares en el grupo de orden de la ventana anterior. -
DENSE_RANK()
: Para x=5,dense_rank
es 3, ya queDENSE_RANK()
alwaysincrements por 1, nunca saltarse un valor. -
ROW_NUMBER()
: Para x=5,row_num
es 4.
Conceptos de funciones analíticas agregadas
Una función agregada es una función que realiza un cálculo en un conjunto de valores. La mayoría de las funciones agregadas se pueden usar en funciones ananalíticas. Estas funciones agregadas se denominan funciones analíticas agregadas.
Con funciones analíticas agregadas, la cláusula OVER
se anexa a la llamada a la función de agregación;la sintaxis de llamada a la función permanece sin cambios.Al igual que sus contrapartes de funciones agregadas, estas funciones analíticas realizan agregaciones, pero específicamente sobre el marco de ventana relevante para cada fila.Los tipos de datos de resultado de estas funciones analíticas son los mismos que sus contrapartes de función de regulación de la imagen.
Ejemplos de funciones analíticas
En estos ejemplos, el elemento resaltado es la fila actual. Los elementos en negrita son las filas que se incluyen en el análisis.
Tablas comunes utilizadas en ejemplos
Las siguientes tablas se utilizan en los siguientes ejemplos de aggregate analyticquery: Produce
Employees
,y Farm
.
Producir tabla
Algunos ejemplos hacen referencia a una tabla llamada 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 |+-------------------------------------+
los Empleados de la tabla
Algunos ejemplos de referencia una tabla denominada 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 |+-------------------------------------+
mesa de Granja
Algunos ejemplos de referencia una tabla denominada 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 un total
Este calcula un gran total de todos los elementos en elProduce
tabla.
- (naranja, manzana, puerro, repollo, lechuga, col rizada) = 54 compras totales
- (naranja, manzana, puerro, repollo, lechuga, col rizada) = 54 compras totales
- (naranja, manzana, puerro, repollo, lechuga, col rizada) = 54 compras totales
- (naranja, manzana, puerro, repollo, lechuga, col rizada) = 54 compras totales
- (naranja, manzana, puerro, col, lechuga, col rizada) = 54 compras totales
- (naranja, manzana, puerro, col, lechuga, col rizada) = 54 compras totales
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 |+-------------------------------------------------------+
Calcular un subtotal
Esto calcula un subtotal para cada categoría en elProduce
.
- fruta
- (naranja, manzana) = 10 compras totales
- (naranja, manzana) = 10 compras totales
- verdura
- (puerro, col, lechuga, col rizada) = 44 compras totales
- (puerro, col, lechuga, col rizada) = 44 compras totales
- (puerro, col, lechuga, col rizada) = 44 compras totales
- (puerro, col, lechuga, col rizada) = 44 compras totales
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 |+-------------------------------------------------------+
Calcular una suma acumulativa
Esto calcula una suma acumulativa para cada categoría en la tablaProduce
. La suma se calcula con respecto al orden definido utilizando la cláusula ORDER BY
.
- fruta
- (naranja, manzana) = 2 compras totales
- (naranja, manzana) = 10 compras totales
- verdura
- (puerro, col, lechuga, col rizada) = 2 compras totales
- (puerro, col, lechuga, col rizada) = 11 compras totales
- (puerro, col, lechuga, col rizada) = 21 compras totales
- (puerro, col, lechuga, col rizada) = 44 compras totales
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 |+-------------------------------------------------------+
Esto hace lo mismo que el ejemplo anterior. No es necesario agregarCURRENT ROW
como límite a menos que lo desee para facilitar la lectura.
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
En este ejemplo, todos los elementos en el Produce
tabla incluida en la partición. Solo se analizan las filas anteriores. El análisis comienza dos veces antes de la fila actual en la partición.
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = NULO
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = NULO
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 2
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 4
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 12
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 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 una media móvil
Esto calcula una media móvil en la tabla Produce
.El límite inferior es 1 fila antes de la fila actual. El límite superior es 1 fila después de la fila actual.
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 2 compras medias
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 4 compras medias
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 6.3333 compras medias
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 9 compras medias
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 14 compras medias
- (naranja, puerro, manzana, repollo, lechuga, col rizada) = 16.5 compras promedio
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 el número de artículos dentro de un rango
Este ejemplo obtiene el número de animales que tienen una población similar en la tabla Farm
.
- (ganso, perro,buey, cabra, pato, gato) = 4 animales entre el rango de población 0-2.
- (ganso, perro,buey, cabra, pato, gato) = 5 animales entre el rango de población 1-3.
- (ganso, perro,buey, cabra, pato, gato) = 5 animales entre el rango de población 1-3.
- (ganso, perro,buey, cabra, pato, gato) = 5 animales entre el rango de población 1-3.
- (ganso, perro,buey, cabra, pato, gato) = 4 animales entre el rango de población 2-4.
- (ganso, perro,buey, cabra, pato, gato) = 1 animal entre el rango de población 22-24.
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 |+----------------------------------------------------------+
Obtenga el elemento más popular de cada categoría
Este ejemplo obtiene el elemento más popular de cada categoría. Define cómo se particionan y ordenan las filas de una ventana en cada partición. Se hace referencia a la tablaProduce
.
- fruta
- (naranja, manzana) = la manzana es la más popular
- (naranja, manzana) = la manzana es la más popular
- vegetal
- (puerro, col, lechuga, col rizada) = la col rizada es la más popular
- (puerro, col, lechuga, col rizada) = la col rizada es la más popular
- (puerro, col, lechuga, col rizada) = la col rizada es la más popular
- (puerro, col, lechuga, col rizada) = la col rizada es la más popular
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 |+----------------------------------------------------+
Obtener el último valor en un rango
Este ejemplo obtiene el elemento más popular en un marco de ventana específico, utilizando el Produce
tabla. El marco de la ventana analiza hasta tres pares a la vez. Eche un vistazo de cerca a la columna most_popular
para verduras.En lugar de obtener el artículo más popular en una categoría específica, obtiene el artículo más popular en un rango específico en esa categoría.
- fruta
- (naranja, manzana) = la manzana es la más popular
- (naranja, manzana) = la manzana es la más popular
- vegetal
- (puerro, col, lechuga, col rizada) = la col es la más popular
- (puerro, col, lechuga, col rizada) = la lechuga es la más popular
- (puerro, col, lechuga, col rizada) = es la más popular
- (puerro, col, lechuga, col rizada) = la col rizada es la más popular
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 ejemplo devuelve los mismos resultados que el ejemplo anterior, pero incluye una ventana llamada item_window
. Algunas de las especificaciones de ventana se definen directamente en la cláusula OVER
y algunas se definen en la ventana con nombre.
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)
Calcular rango
Este ejemplo calcula el rango de cada empleado dentro de su departamento,en función de su fecha de inicio. La especificación de ventana se define directamente en la cláusula OVER
. Se hace referencia a la tabla Employees
.
- departamento 1
- (Jacob, Anthony, Andrew) = Asignar el rango 1 a Jacob
- (Jacob, Anthony, Andrew) = Asignar el rango 2 a Anthony
- (Jacob, Anthony, Andrew) = Asignar el rango 3 a Andrew
- departamento 2
- (Isabella, Daniel, Jose) = Asignar el rango 1 a Isabella
- (Isabella, Daniel, Jose) = Asignar rango 2 a Daniel
- (Isabella, Daniel, Jose) = Asignar rango 3 a 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 |+--------------------------------------------+
Usar una ventana con nombre en una cláusula de marco de ventana
Puede definir parte de su lógica en una ventana con nombre y parte de ella en cláusula marco de ventana abierta. Esta lógica se combina. Este es un ejemplo, usando la tablaProduce
.
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 |+-------------------------------------------------------+
también puede obtener los resultados anteriores con estos ejemplos:
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)
El siguiente ejemplo se produce un error porque el marco de una ventana cláusula beendefined dos veces:
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