Ejercicios de función de ventana

-- 一 OVER() 学习目标
-- 掌握窗口函数的基本语法和OVER()的使用方法
-- 0 数据集介绍
-- 本小结我们先介绍窗口函数中最重要的关键字 OVER()
-- 在介绍具体内容之前先熟悉一下要用到的数据,我们选择了很常见的业
-- 务来介绍窗口函数的使用
-- 三张表:员工表,部门表,采购表
-- id first_name last_name department_id salary years_worked 1 Diane Turner 1 5330 4 2 Clarence Robinson 1 3617 2 3 Eugene Phillips 1 4877 2 4 Philip Mitchell 1 5259 3 5 Ann Wright 2 2094 5 6 Charles Wilson 2 5167 5 7 Russell Johnson 2 3762 4 8 Jacqueline Cook 2 6923 3 9 Larry Lee 3 2796 4 10 Willie Patterson 3 4771 5 11 Janet Ramirez 3 3782 2 12 Doris Bryant 3 6419 1 13 Amy Williams 3 6261 1 14 Keith Scott 3 4928 8 15 Karen Morris 4 6347 6 16 Kathy Sanders 4 6286 1 17 Joe Thompson 5 5639 3 18 Barbara Clark 5 3232 1 19 Todd Bell 5 4653 1 20 Ronald Butler 5 2076 5
-- 员工表:员工id,姓名,员工所属部门id( department_id ),工
-- 资( salary ),工龄( years_worked )
-- 部门表:部门id,部门名称
-- 采购表:每个部门( department_id )采购的物品明细
-- ( item ),物品价格( price )
-- 员工表(employee)
-- id name 1 IT 2 Management 3 Human Resources 4 Accounting 5 Help Desk
-- 部门表(DEPARTMENT)
-- 采购表(purchase)
-- id department_id item price 1 4 monitor 531
-- 2 1 printer 315
-- 3 3 whiteboard 170
-- 4 5 training 117
-- 5 3 computer 2190
-- 6 1 monitor 418
-- 7 3 whiteboard 120
-- 8 3 monitor 388
-- 9 5 paper 37
-- 10 1 paper 695
-- 11 3 projector 407
-- 12 4 garden party 986
-- 13 5 projector 481
-- 14 2 chair 180
-- 15 2 desk 854
-- 16 2 post-it 15
-- 17 3 paper 60
-- 18 2 tv 943
-- 19 2 desk 478
-- 20 5 keyboard 214
-- 要用到的数据已经熟悉了,接下来我们使用上面的数据来介绍窗口函数
-- 究竟什么是窗口函数?
-- 窗口函数是对表中一组数据进行计算的函数,一组数据跟当前行相
-- 关
-- 例如:想计算每三天的销售总金额,就可以使用窗口函数,以当前
-- 行为基准,选前一行,后一行,三行一组如下图所示
-- 之所以称之为窗口函数,是因为好像有一个固定大小的窗框划过数
-- 据集,滑动一次取一次,对窗口内的数据进行处理
-- 看下窗口函数的语法:
-- <window_function> OVER (...) <window_function> 这里可以是我们之前已经学过的聚合函数,
-- 比如( COUNT() , SUM() , AVG() 等等)
-- 也以是其他函数,比如ranking 排序函数,分析函数等,后面的
-- 课程中会介绍
-- OVER(...) 窗口函数的窗框通过 OVER(...) 子句定义,窗口函
-- 数中很重要的部分就是通过 OVER(...) 定义窗框 (开窗方式和大
-- 小)




-- 1 OVER()基本用法
-- 首先看 OVER (...) 的最基本用法: OVER() 意思是所有的数据都在
-- 窗口中
SELECT
	first_name,
	last_name,
	salary,
	AVG( salary ) OVER () 
FROM
	employee;
	
-- -- 练习1
-- 需求:创建报表,除了查询每个人的工资之外,还要统计出公司每月的
-- 工资支出
SELECT
	first_name,
	last_name,
	salary,
	SUM( salary ) over () 
FROM
	employee;
	
-- 	练习2
-- 需求:统计采购表中的平均采购价格,并与明细一起显示(每件物品名
-- 称,价格)
SELECT item,price,AVG(price) OVER()
FROM purchase;

-- 2 将OVER()的结果用于进一步计算
-- 通常, OVER() 用于将当前行与一个聚合值进行比较,例如,我们可以
-- 计算出员工的薪水和平均薪水之间的差。
SELECT 
	first_name,
	last_name,
	salary,
	AVG(salary) OVER(),
	salary -
	AVG(salary) OVER() 
	as nowsalary
	FROM employee;

-- 练习3
-- 需求:创建报表统计每个员工的工龄和平均工龄之间的差值
-- 报表中包含如下字段:
-- 员工的名字,员工的姓氏,员工的工龄,所有员工的平均工龄,员
-- 工工龄和平均工龄之间的差值
SELECT 
	first_name,
	last_name,
	years_worked,
	AVG(years_worked) OVER(),
	years_worked -
	AVG(years_worked) OVER() 
	as nowyears
	FROM employee;
	
SELECT
	id,
	item,
	price,
	price / SUM( price ) OVER () 
FROM
	purchase 
WHERE
	department_id = 2;


-- 需求:统计人力资源部(部门ID为3) 的员工薪资,并将没名员工的薪
-- 资与部门平均薪资进行比较
-- first_name , last_name , salary 和 difference (员工薪
-- 资与部门平均薪资的差值)
SELECT
	first_name,
	last_name,
	salary,
	salary-AVG(salary) over() as diff
	FROM employee
	WHERE department_id =3;





-- 练习5
-- 需求:查询月薪超过4000的员工,并统计所有月薪超过4000的员工数量
-- 查询结果字段: first_name , last_name , salary 和 超过4000的员
-- 工数量
SELECT first_name,
	last_name,
	salary,
	COUNT(id)over()
	FROM employee WHERE salary >4000;

-- 练习6
-- 需求:查询人力资源部( department_id = 3 )的采购情况
-- 查询如下字段:
-- id , department_id , item , price ,最高采购金额,最高采购金
-- 额和每项采购的金额差值

SELECT 
	id,
	department_id,
	item,
	price,
	MAX(price)over() as max_price,
	MAX(price)over() - price as diff
	FROM purchase
	WHERE department_id =3;

-- 练习7-一句SQL中使用两个窗口函数
-- 接下来我们看一下如何在一句SQL中使用两个窗口函数
-- 需求:创建报表,在purchase表基础上,添加平均价格和采购总金额两
-- 列
-- 包含如下字段: id , item , price , 平均价格和所有物品总价格
SELECT
	id,
	item,
	price,
	MAX( price ) over (),
	SUM(price) over () 
FROM
	purchase;
	
	SELECT 
		first_name,
		last_name,
		salary,
		AVG(salary)over(),
		salary -AVG(salary)over()
		FROM employee
		WHERE department_id =1;
	
-- 练习8
-- 需求:查询部门id为1,2,3三个部门员工的姓名,薪水,和这三个部
-- 门员工的平均薪资
SELECT
	first_name,
	last_name,
	salary,
	AVG( salary ) OVER() AS avg 
FROM
	employee 
WHERE
	department_id IN( 1, 2, 3 );


SELECT
	first_name,
	last_name,
	salary,
	AVG( salary ) OVER () 
FROM
	employee 
WHERE
	salary > AVG( salary ) OVER ();
-- 练习9
-- 需求:统计ID 为1,3,5的部门,员工的平均工龄
-- 结果字段: first name , last name , years_worked 和平均工龄
SELECT
	first_name,
	last_name,
	years_worked,
	AVG( years_worked ) over () AS avg 
FROM
	employee 
WHERE
	department_id IN (
		1,
		3,
	5)









-- 练习10
-- 需求:统计每一次采购的基本信息包括
-- id , name ,采购部门名称
-- item ,采购的物品明细
-- price , 采购价格
-- minimum price ,最低采购价格
-- 当前价格 price 与最低采购价格 minimum price 的差价


Supongo que te gusta

Origin blog.csdn.net/qq_58432443/article/details/126896022
Recomendado
Clasificación