¿Qué son las funciones de ventana?
Las funciones de ventana permiten a los usuarios realizar cálculos con particiones (es decir, subgrupos o secciones) de un conjunto de resultados, normalmente una tabla o los resultados de otra consulta. A diferencia de las funciones de agregación tradicionales, que devuelven un único valor para cada grupo definido en la consulta, las funciones de ventana devuelven un único valor para cada fila de entrada.
¿Cómo son útiles las funciones de ventana?
Las funciones de ventana aumentan la eficiencia y reducen la complejidad de las consultas que analizan particiones (ventanas) de un conjunto de datos al proporcionar una alternativa a conceptos SQL más complejos, p. consultas derivadas. Los casos de uso comunes incluyen:
- Resultados de clasificación dentro de una ventana específica (por ejemplo, clasificación por grupo)
- Acceso a datos de otra fila en una ventana específica (por ejemplo, informes de período a período)
- Agregación dentro de una ventana específica (por ejemplo, totales acumulados):
Cómo usar las funciones de ventana
Las funciones de ventana se inician con OVER
y se configuran utilizando tres conceptos:
- partición de ventana (
PARTITION BY
) - agrupa filas en particiones - ordenación de ventanas (
ORDER BY
) - define el orden o secuencia de filas dentro de cada ventana - marco de ventana (
ROWS
) - define la ventana mediante el uso de un desplazamiento de la fila especificada
Descripción general de la sintaxis
function (expression) OVER
( [ PARTITION BY expression_list ]
[ ORDER BY order_list ]
[ ROWS frame_clause ])
Definiciones
- expression_list:lista de expresiones separadas por comas, generalmente nombres de columnas
- order_list:lista de expresiones separadas por comas, generalmente nombres de columnas
- frame_clause:define el desplazamiento usando
CURRENT ROW
,_value_ PRECEDING
,UNBOUNDED PRECEDING
,_value_ FOLLOWING
,UNBOUNDED FOLLOWING
Ejemplos
Clasificación:clasificación por grupo
SELECT
campaign
, month
, total_cost
, rank() OVER (PARTITION BY month ORDER BY month DESC, total_cost DESC) as "rank"
FROM Cost_by_Month
LIMIT 8
Fila anterior:análisis período-sobre-período
SELECT
campaign
, month
, total_cost
, LAG(total_cost, 1) OVER (ORDER BY campaign, month) as "previous total cost"
FROM Cost_by_Month
WHERE campaign = 'TV'
LIMIT 4
Agregación dentro de una ventana:totales acumulados
SELECT
campaign, month, monthly_cost
, sum(monthly_cost) OVER (PARTITION BY campaign ORDER BY month ROWS BETWEEN UNBOUNDED
PRECEDING and CURRENT ROW) as "running cost total"
FROM Cost_by_Month
Documentación y lista de funciones:
Tenga en cuenta que existen diferencias sutiles en el uso y la sintaxis de una base de datos a otra. Para obtener información específica de su implementación, utilice la documentación específica de la fuente que se proporciona a continuación.
Postgres
- Tutorial
- Funciones
Desplazamiento al rojo
- Tutorial
- Funciones
Oráculo
- Tutorial
Servidor SQL
- Tutorial
BigQuery
- Tutorial