博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 2012 开发新特性:分析函数
阅读量:5934 次
发布时间:2019-06-19

本文共 2117 字,大约阅读时间需要 7 分钟。

一、概述

  分析函数(或称解析函数)基于一组行计算聚合值。不过,与聚合函数不同,它们可能针对每个组返回多行。可以使用分析函数来计算移动平均线、运行总计、百分比或一个组内的前 N 个结果。

  官网

  SQL Server 2012 支持以下 8 个分析函数:

1、CUME_DIST

2、LEAD

  访问相同结果集的后续行中的数据,而不使用 SQL Server 2012 中的自联接。 LEAD 以当前行之后的给定物理偏移量来提供对行的访问。 在 SELECT 语句中使用此分析函数可将当前行中的值与后续行中的值进行比较。  

3、FIRST_VALUE

4、PERCENTILE_CONT

5、LAG

  访问相同结果集的先前行中的数据,而不使用 SQL Server 2012 中的自联接。 LAG 以当前行之前的给定物理偏移量来提供对行的访问。 在 SELECT 语句中使用此分析函数可将当前行中的值与先前行中的值进行比较。     

6、PERCENTILE_DISC

7、LAST_VALUE

8、PERCENT_RANK

二、构造测试环境

CREATE TABLE [dbo].[Profits](

[Territory] [varchar](2) NOT NULL,
[FiscalYear] [smallint] NOT NULL,
[Profit] [int] NOT NULL,
CONSTRAINT [PK_Profits] PRIMARY KEY CLUSTERED
([Territory] ASC, [FiscalYear] ASC) ON [PRIMARY]
) ON [PRIMARY]

declare @x smallint,@y tinyint

set @x=2011
while @x<=2012
begin
set @y=0
while @y<3
begin
insert into dbo.Profits
values
( substring('CNUSEU' , @y *2+1 , 2),
@x,
cast(floor(rand()*1000) as int))
set @y = @y + 1
end
set @x = @x + 1
end

三、示例

1、查询某个区域在后续年度的销售业绩的差异。

SELECT Territory, FiscalYear, Profit AS CurrentProfit,

LEAD(Profit, 1, 0) OVER(ORDER BY Territory) AS NextProfit
FROM Profits
where Territory ='CN'

  结果:

Territory FiscalYear CurrentProfit NextProfit

CN 2011 551 925
CN 2012 925 0

2、查询每个区域在后续年度的销售业绩的差异。

SELECT Territory, FiscalYear, Profit AS CurrentProfit,

LEAD(Profit, 1, 0) OVER(PARTITION BY Territory ORDER BY FiscalYear) AS NextProfit
FROM Profits
where FiscalYear in (2011,2012)

  结果:

Territory FiscalYear CurrentProfit NextProfit

CN 2011 551 925
CN 2012 925 0
EU 2011 227 50
EU 2012 50 0
US 2011 87 595
US 2012 595 0

3、查询每个区域在先前年度的销售业绩的差异。

SELECT Territory, FiscalYear, Profit AS CurrentProfit,

LAG(Profit, 1, 0) OVER (PARTITION BY Territory ORDER BY FiscalYear) AS PrevProfit
FROM Profits
where FiscalYear in (2011,2012)

  结果:

Territory FiscalYear CurrentProfit PrevProfit

CN 2011 551 0
CN 2012 925 551
EU 2011 227 0
EU 2012 50 227
US 2011 87 0
US 2012 595 87

4. 连续3年的“行列转换”

select * from (

SELECT Territory, FiscalYear, Profit AS FY11,

LEAD(Profit, 1, 0) OVER(ORDER BY Territory) AS Fy12

,LEAD(Profit, 2, 0) OVER(ORDER BY Territory) AS Fy13

FROM Profits ) tmp

where FiscalYear=2011

转载地址:http://oyctx.baihongyu.com/

你可能感兴趣的文章
七天学会ASP.NET MVC (四)——用户授权认证问题
查看>>
Linux 网络实用手册
查看>>
跨域访问的解决方案(非HTML5的方法:JSONP)
查看>>
redis-事务
查看>>
大数据系统数据采集产品的架构分析
查看>>
SSM简单整合
查看>>
scala list
查看>>
Qutarz动态多任务定时功能实现
查看>>
设计模型之原型模型与cloneable接口(深度克隆与浅度克隆区别)
查看>>
FL Studio导入MIDI文件方法
查看>>
CentOS 7 中使用NTP进行时间同步
查看>>
MySQL 导入数据
查看>>
使用python读取mysql数据库并进行数据的操作
查看>>
GitHub:我们是这样弃用jQuery的
查看>>
隐藏输入法和弹出输入法
查看>>
Linux命令之tar:文件打包(备份)、压缩、解压
查看>>
CI框架不定期更新
查看>>
Spring源码解析-AutowiredAnnotationBeanPostProcessor
查看>>
list.add并不是copy
查看>>
什么是SSL预证书?
查看>>