page301-354其它解决方式 ---开窗函数 --測试数据及表 USE [NB] GO /****** 对象: Table [dbo].[T_Person2] 脚本日期: 08/14/2015 11:24:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[T_Person3] ( [FName] [varchar] (20) NULL, [FCity] [varchar] (20) NULL, [FAge] INT, FSalary INT ) ON [PRIMARY] GO SET ANSI_PADDING OFF INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Tom' ,'BeiJing', 20,3000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Tim' ,'ChengDu', 21,4000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Jim' ,'BeiJing', 22,3500 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Lily' ,'LonDon', 21,2000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('John' ,'NewYork', 22,1000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('YaoMing' ,'BeiJing', 20,3000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Swing' ,'LonDon', 22,2000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Guo' ,'NewYork', 20,2800 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('YuQian' ,'BeiJing', 24,8000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Ketty' ,'London', 25,8500 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Merry' ,'BeiJing', 23,3500 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Smith' ,'ChengDu', 30,3000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Bill' ,'BeiJing', 25,2000 ) INSERT INTO T_Person3(FName ,FCity, FAge,FSalary ) VALUES('Jerry' ,'NewYory', 24,3300 ) SELECT * FROM T_Person3 --与聚合函数一样,开窗函数也是对行集组进行聚合计算 --可是它不像普通聚合函数那样每组仅仅返回一个值 ,开窗函数能够 --为每组返回多个值,由于开窗函数所运行聚合计算的行集组是窗 --口ISO SQL 规定了这种函数为开窗函数 ,在oracle 中则被称为 --分析函数, 而在DB2中则被称为 OLAP函数 SELECT COUNT (*) FROM T_Person3 --以下俩个表达是一个意思 SELECT FCity, FAge,COUNT (*) OVER () FROM T_Person3 SELECT FCity, FAge,COUNT (*) FROM T_Person3 WHERE FSalary < 5000 GROUP BY FCity,FAge --OVERkeyword表示把函数当成开窗函数而不是聚合函数 --SQL标准同意将全部聚合函数用做开窗函数 ,使用OVER keyword来 --区分这俩种使用方法 --上面中count(*)over() 对于查询结果的每一行都返回全部符合 --条件的行的条数OVER()keyword后的括号里还常常加入选项 ,用以 --改变进行聚合运算的窗体范围假设 OVER()keyword后面的括号里的 --选项为空, 则开窗函数会对结果集中的全部行进行聚合运算 --partition by 子句 --开窗函数over() keyword后的括号里 ,能够使用partition by 子句 --来定义行的区分,从而进行聚合计算与 group by子句不同, --partition by子句创建的分区是独立于结果集的 ,创建的分区仅仅是 --提供聚合计算的并且不同的开窗函数所创建的分区也互不影响 --范例以下SQL 用于显示每个人员的信息及所属城市的人员数 --同一个SQL 语句中能够使用多个开窗函数 ,并且这些开窗函数并不会 --相互干扰 --范例 SELECT FName, FCity, FAge , FSalary, COUNT(*) OVER ( PARTITION BY FCity), COUNT(*) OVER ( PARTITION BY FAge) FROM t_Person3 --with子句与子查询 --一次定义多次使用用于提取子查询 WITH SSSS AS ( SELECT FAge FROM T_person3 WHERE FAge <24 ) SELECT * FROM T_person3 AS t WHERE T.FAge IN ( SELECT * FROM SSSS ) --374 with cr as ( select FAge from T_person3 ) select * from T_person3 where FAge in ( select * from cr )
时间: 2024-09-30 11:28:13