开窗函数_2

开窗函数


与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,
开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计算的行集组是窗口。
ISO SQL 规定了这样的函数为开窗函数(在 Oracle 中则被称为分析函数,而在 DB2 中则被称为 OLAP 函数)

--要求:查询每个工资小于 5 000 元的员工信息(城市及年龄),并且在每行中都显示所有工资小于 5 000 元的员工个数
--          意味要列出3个字段:   城市、年龄、个数(薪资<5000)

/*
--开窗函数训练 ,《程序员的经典》
*/

--
先建立一个表结构、例子数据 CREATE TABLE T_Person ( FName VARCHAR(20), FCity VARCHAR(20), FAge INT, FSalary INT) GO INSERT INTO T_Person(FName,FCity,FAge,FSalary) VALUES('Tom','BeiJing',20,3000), ('Tim','ChengDu',21,4000), ('Jim','BeiJing',22,3500), ('Lily','London',21,2000), ('John','NewYork',22,1000), ('YaoMing','BeiJing',20,3000), ('Swing','London',22,2000), ('Guo','NewYork',20,2800), ('YuQian','BeiJing',24,8000), ('Ketty','London',25,8500), ('Kitty','ChengDu',25,3000), ('Merry','BeiJing',23,3500), ('Smith','ChengDu',30,3000), ('Bill','BeiJing',25,2000), ('Jerry','NewYork',24,3300) --delete from T_Person --select * from T_Person
select count(*)  as [汇总人数]
from T_Person

运行结果:             -----------------因为窗口函数时建立在聚合函数之上的,所以此处只是显示一下
      

--每行中都显示所有员工薪资<5000的员工的个数
select FCITY,FAGE,
(
    SELECT COUNT(*) FROM T_Person   ----------------->>>这个部分,只是显示了一个字段,不划算              
    WHERE FSALARY < 5000
)
FROM T_Person
WHERE FSALARY < 5000

运行结果:
      

 

 

--使用开窗函数统计(每行中都显示所有员工薪资<5000的员工的个数)
--开窗函数在聚合函数后增加了一个over关键字
select FCity,FAge,count(*) over() [每行中都显示所有员工薪资<5000的员工的个数]            ------>此处OVER()括号中为空,表示对所有行进行聚合计算
from T_Person
where FSalary < 5000

运行结果:
      

 

 

--定义行的分区,从而进行聚合计算
--select * from T_Person
select FName,FCity,FAge,FSalary,
       count(*) over(partition by FCity) as [按FCity]
from T_Person

运行结果:
      

 

 

----定义行的分区,从而进行聚合计算
--select * from T_Person
select FName,FCity,FAge,FSalary,
          count(*) over(partition by FAge) as [按FAge]
from T_Person

运行结果:
      

----定义行的分区,从而进行聚合计算
--select * from T_Person
select FName,FCity,FAge,FSalary,
          count(*) over(partition by FAge) as [按FAge]
from T_Person

运行结果:
      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




posted @ 2020-05-25 14:58  CDPJ  阅读(142)  评论(0编辑  收藏  举报