随笔003:开窗函数

当需提取数据的汇总数或者排序数,但是又要显示非分组字段的字段时,可用统计函数\排序函数+OVER()【即开窗函数】

例如:获取客户的所有订单同时显示客户的统计总订单数,不用开窗函数则脚本如下:

SELECT [SalesOrderID]
      ,[OrderDate]
      ,[CustomerID]
      ,[SalesPersonID]
      ,[SubTotal]
      ,[TaxAmt]
      ,(SELECT COUNT(*)FROM [AdventureWorks2008R2].[Sales].[SalesOrderHeader] B
        WHERE A.CustomerID = B.CustomerID) 客户总单数
  FROM [AdventureWorks2008R2].[Sales].[SalesOrderHeader] A
  order by CustomerID,SalesOrderID

若用开窗函数则脚本如下:

SELECT [SalesOrderID]
      ,[OrderDate]
      ,[CustomerID]
      ,[SalesPersonID]
      ,[SubTotal]
      ,[TaxAmt]
      , COUNT(*) over(partition by customerId) 客户总单数
  FROM [AdventureWorks2008R2].[Sales].[SalesOrderHeader] A
  order by CustomerID,SalesOrderID

两者结果

用开窗函数脚本相对要简单些,也容易看明白

随笔003:开窗函数,布布扣,bubuko.com

时间: 2024-11-18 01:07:04

随笔003:开窗函数的相关文章

SQL开窗函数

开窗函数:在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成.为了解决这些问题,在 2003 年 ISO SQL 标准加入了开窗函数,开窗函数的使用使得这些经典的难题可以被轻松的解决.目前在 MSSQLServer.Oracle.DB2 等主流数据库中都提供了对开窗函数的支持,不过非常遗憾的是 MYSQL 暂时还未对开窗函数给予支持. 开窗函数简介:与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值

sqlserver开窗函数

从 http://jimshu.blog.51cto.com/3171847/1376637/ 转 开窗函数是在 ISO 标准中定义的.SQL Server 提供排名开窗函数和聚合开窗函数. 在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成.SQL Server 2005 引入了开窗函数,使得这些经典的难题可以被轻松的解决. 窗口是用户指定的一组行.开窗函数计算从窗口派生的结果集中各行的值.开窗函数分别应用于每个分区,并为每个分区重新启动

深入浅出谈开窗函数(一)

      在开窗函数出现之前存在着非常多用 SQL 语句非常难解决的问题,非常多都要通过复杂的相关子查询或者存储过程来完毕.为了解决这些问题,在2003年ISO  SQL标准增加了开窗函数,开窗函数的使用使得这些经典的难题能够被轻松的解决.眼下在 MSSQLServer.Oracle.DB2 等主流数据库中都提供了对开窗函数的支持,只是非常遗憾的是 MYSQL 临时还未对开窗函数给予支持.  为了更加清楚地理解,我们来建表并进行相关的查询(截图为MSSQLServer中的结果)        

SQL SERVER 开窗函数简介

在SQL SERVER 2005/2008支持两种排名开窗函数和聚集开窗函数. 以SQL SERVER中分面页为例,按时间顺序列出定单号. WITH OrderInfo AS ( SELECT ROW_NUMBER() OVER(ORDER BY OrderDate) AS Number, OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK) ) SELECT Number,OrderID,CustomerID, Employ

SQL Server 2012 - 开窗函数

-- 开窗函数:在结果集的基础上进一步处理(聚合操作) -- Over函数,添加一个字段显示最大年龄 SELECT * , MAX(StuAge) OVER ( ) MaxStuAge FROM dbo.Student; -- Over函数,添加一个字段显示总人数 SELECT * , COUNT(StuID) OVER ( ) StuCount FROM dbo.Student; -- Partition By 分组统计数量 -- 根据性别分组后,统计 SELECT COUNT(*) OVER

sql中的 开窗函数over() 聚合函数 排名函数

开窗函数与聚合函数一样,都是对行的集合组进行聚合计算.它用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列.反正我理解这个函数已经使用好子查询或者是其它方式求得聚合列的值给我合并. 以书中的例子一步一步来介绍,假设要计算所有人员的总数,我们可以执行下面的SQL语句: SELECT COUNT(FName) FROM T_Person 这种方式比较直接,只返回一个聚合列的值,没有任

sql over开窗函数

1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单表(order)中统计中,生成这么每一条记录都包含如下信息:“所有订单的总和”.“每一位客户的所有订单的总和”.”每一单的金额“ 关键点:使用了sum() over() 这个开窗函数 如图: 代码如下: select customerID, SUM(totalPrice) over() as AllTotalPrice, SU

sql server中的开窗函数over、视图、事物

一.开窗函数over的作用有两个: 1.排序order by,row_number,翻页 2.划区partition by,结合聚合函数针对某部分数据进行汇总 翻页的sql server 语句: select * from ( select *,row_number() over( order by id) as num from 表名) as t where t.num>6 and t.num<10 二.视图:用于存储一个select语句.并不是存储数据的一个容器. create view

SQL Server排名函数与排名开窗函数

什么是排名函数?说实话我也不甚清楚,我知道 order by 是排序用的,那么什么又是排名函数呢? 接下来看几个示例就明白了. 首先建立一个表,随便插入一些数据. ROW_NUMBER 函数:直接排序,ROW_NUMBER函数是以上升进行直接排序,并且以连续的顺序给每一行数据一个唯一的序号.(即排名连续) 1 -- 以下是根据 U_Pwd 这一列进行排名(升序) 2 select *, 3 '第'+convert(varchar,ROW_NUMBER() over(order by U_Pwd)