funciones de ventana postgresql

Introducción a las funciones de ventana.

Incluye AVG, COUNT, MAX, MIN, SUM y
STRING_AGG. La función de la función agregada es realizar operaciones en un conjunto de filas de datos y devolver una
función de ventana (función de ventana) para el análisis de resultados resumidos.
Sin embargo, la función de ventana no resume un conjunto de datos en un solo resultado, sino que, para cada fila de datos, calcula
un resultado basado en un conjunto de datos relacionados con ella. La siguiente figura demuestra la diferencia entre funciones agregadas y funciones de ventana, la diferencia
Insertar descripción de la imagen aquí
es que estas últimas contienen la palabra clave OVER, los corchetes vacíos indican que todos los datos se analizan como un todo, por lo que los valores obtenidos son los mismos que los del agregado. función.

Definición de función de ventana

window_function ( expression, ... ) OVER (
 PARTITION BY ...
 ORDER BY ...
 frame_clause
)

window_functiones el nombre de la función de ventana; expressiones el parámetro de la función, algunas funciones no requieren parámetros;
overla cláusula contiene tres opciones: partición ( partition by), clasificación ( order by) y tamaño de ventana
( frame_clause)

Dividir

-- 计算员工的部门平均薪水
-- partition by分组统计,和group by 类似
select 
e.employee_id ,
e.first_name ,
e.last_name ,
e.salary ,
e.department_id ,
round(avg(e.salary) over(partition by e.department_id),2) as avg_sal
from employees e;

Insertar descripción de la imagen aquí
La opción dividir por se utiliza para definir particiones, que son similares a agrupar por. Si se especifica la opción de partición,
la función de ventana analizará cada partición por separado; si se omite la opción de partición, todos los datos se analizarán
como un todo.

Opciones de clasificación

La opción ordenar por se utiliza para especificar el método de clasificación dentro de la partición, generalmente utilizada para el análisis de clasificación de datos.

-- 员工在部门内薪水排名
select 
e.employee_id ,
e.first_name ,
e.last_name,
e.salary ,
e.department_id ,
rank() over(partition by e.department_id order by e.salary desc)
from employees e;

Insertar descripción de la imagen aquí

opciones de ventana

La opción frame_clause se utiliza para especificar una ventana de cálculo dentro de la partición actual. Después de especificar la ventana, la función de análisis ya no
se calcula en función de la partición, sino en función de los datos dentro de la ventana.

-- public.sales_monthly definition

-- Drop table

-- DROP TABLE public.sales_monthly;

CREATE TABLE public.sales_monthly (
	product varchar(20) NULL,
	ym varchar(10) NULL,
	amount numeric(10, 2) NULL
);
INSERT INTO public.sales_monthly (product,ym,amount) VALUES
	 ('苹果','201801',10159.00),
	 ('苹果','201802',10211.00),
	 ('苹果','201803',10247.00),
	 ('苹果','201804',10376.00),
	 ('苹果','201805',10400.00),
	 ('苹果','201806',10565.00),
	 ('苹果','201807',10613.00),
	 ('苹果','201808',10696.00),
	 ('苹果','201809',10751.00),
	 ('苹果','201810',10842.00);
INSERT INTO public.sales_monthly (product,ym,amount) VALUES
	 ('苹果','201811',10900.00),
	 ('苹果','201812',10972.00),
	 ('苹果','201901',11155.00),
	 ('苹果','201902',11202.00),
	 ('苹果','201903',11260.00),
	 ('苹果','201904',11341.00),
	 ('苹果','201905',11459.00),
	 ('苹果','201906',11560.00),
	 ('香蕉','201801',10138.00),
	 ('香蕉','201802',10194.00);
INSERT INTO public.sales_monthly (product,ym,amount) VALUES
	 ('香蕉','201803',10328.00),
	 ('香蕉','201804',10322.00),
	 ('香蕉','201805',10481.00),
	 ('香蕉','201806',10502.00),
	 ('香蕉','201807',10589.00),
	 ('香蕉','201808',10681.00),
	 ('香蕉','201809',10798.00),
	 ('香蕉','201810',10829.00),
	 ('香蕉','201811',10913.00),
	 ('香蕉','201812',11056.00);
INSERT INTO public.sales_monthly (product,ym,amount) VALUES
	 ('香蕉','201901',11161.00),
	 ('香蕉','201902',11173.00),
	 ('香蕉','201903',11288.00),
	 ('香蕉','201904',11408.00),
	 ('香蕉','201905',11469.00),
	 ('香蕉','201906',11528.00),
	 ('桔子','201801',10154.00),
	 ('桔子','201802',10183.00),
	 ('桔子','201803',10245.00),
	 ('桔子','201804',10325.00);
INSERT INTO public.sales_monthly (product,ym,amount) VALUES
	 ('桔子','201805',10465.00),
	 ('桔子','201806',10505.00),
	 ('桔子','201807',10578.00),
	 ('桔子','201808',10680.00),
	 ('桔子','201809',10788.00),
	 ('桔子','201810',10838.00),
	 ('桔子','201811',10942.00),
	 ('桔子','201812',10988.00),
	 ('桔子','201901',11099.00),
	 ('桔子','201902',11181.00);
INSERT INTO public.sales_monthly (product,ym,amount) VALUES
	 ('桔子','201903',11302.00),
	 ('桔子','201904',11327.00),
	 ('桔子','201905',11423.00),
	 ('桔子','201906',11524.00);

/*
 * 计算每个产品当当前月份的累计销量
*/
select
	m.product ,
	m.ym ,
	m.amount,
	sum(m.amount) over(partition by m.product 
	order by m.ym rows between unbounded  preceding and current row)
from
	sales_monthly m
	order by m.product,m.ym;

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Las funciones de ventana comunes se pueden dividir en las siguientes categorías: funciones de ventana de agregación, funciones de ventana de clasificación y funciones de ventana de valor.
Para opciones más complejas, consulte la documentación oficial.

Supongo que te gusta

Origin blog.csdn.net/Java_Fly1/article/details/132791762
Recomendado
Clasificación