zoukankan      html  css  js  c++  java
  • 金典 SQL笔记(9)

    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 )
    


  • 相关阅读:
    腾讯QQ服务器汇总表 及禁用QQ方法
    C#下一个SQL SERVER数据库操作类
    获取页面运行时间以及数据库查询次数
    GridView导出Excel
    使用FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
    JS图片loading及放大查看效果(兼容IE,FF)
    .NET 开发人员十个必备工具
    jsp日期时间格式化输出
    MyEclipse6.5与Perforce的集成
    [转]firefox与IE的nextSibling
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7290106.html
Copyright © 2011-2022 走看看