窗口函数小结

样本数据库下载:

http://files.cnblogs.com/files/haseo/TSQL2012.rar

1.窗口聚合函数

除了多个OVER子句其实和分组聚合函数一样。

SELECT  custid ,
        orderid ,
        val ,
        SUM(val) OVER ( PARTITION BY custid ) AS custtotal ,
        SUM(val) OVER ( ) AS grandtotal
FROM    Sales.OrderValues;
custid orderid val custtotal grandtotal
1 10643 814.5 4273 1265793
1 10692 878 4273 1265793
1 10702 330 4273 1265793
1 10835 845.8 4273 1265793
1 10952 471.2 4273 1265793
1 11011 933.5 4273 1265793
2 10926 514.4 1402.95 1265793
2 10759 320 1402.95 1265793
2 10625 479.75 1402.95 1265793
2 10308 88.8 1402.95 1265793
3 10365 403.2 7023.98 1265793
3 10507 749.06 7023.98 1265793
SELECT  custid ,
        orderid ,
        val ,
        CAST(100.0 * val / SUM(val) OVER ( PARTITION BY custid ) AS NUMERIC(5,2)) AS pctcust ,
        CAST(100.0 * val / SUM(val) OVER ( ) AS NUMERIC(5, 2)) AS pcttotal
FROM    Sales.OrderValues;
custid orderid val pctcust pcttotal
1 10643 814.5 19.06 0.06
1 10692 878 20.55 0.07
1 10702 330 7.72 0.03
1 10835 845.8 19.79 0.07
1 10952 471.2 11.03 0.04
1 11011 933.5 21.85 0.07
2 10926 514.4 36.67 0.04
2 10759 320 22.81 0.03
2 10625 479.75 34.2 0.04
2 10308 88.8 6.33 0.01
3 10365 403.2 5.74 0.03
3 10507 749.06 10.66 0.06

框架限定(必须要排序)

UNBOUNDED PRECEDING   统计之前所有记录

<n> ROWS PRECEDING 统计前面几行

CURRENT ROW  当前行

UNBOUNDED FOLLOWING 本组下一行

SELECT  custid ,
        orderid ,
        orderdate ,
        val ,
        SUM(val) OVER ( PARTITION BY custid ORDER BY orderdate, orderid
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  --可以直接简写为 ROWS UNBOUNDED PRECEDING
--ROWS  BETWEEN 2 PRECEDING AND CURRENT ROW
) AS runningtotal
FROM    Sales.OrderValues;
custid orderid orderdate val runningtotal
1 10643 2007/8/25 814.5 814.5
1 10692 2007/10/3 878 1692.5
1 10702 2007/10/13 330 2022.5
1 10835 2008/1/15 845.8 2868.3
1 10952 2008/3/16 471.2 3339.5
1 11011 2008/4/9 933.5 4273
2 10308 2006/9/18 88.8 88.8
2 10625 2007/8/8 479.75 568.55
2 10759 2007/11/28 320 888.55
2 10926 2008/3/4 514.4 1402.95
3 10365 2006/11/27 403.2 403.2
3 10507 2007/4/15 749.06 1152.26
3 10535 2007/5/13 1940.85 3093.11
3 10573 2007/6/19 2082 5175.11

2.排名函数

SELECT  custid ,
        orderid ,
        val ,
        ROW_NUMBER() OVER ( ORDER BY val ) AS rownum ,
        RANK() OVER ( ORDER BY val ) AS rnk ,
        DENSE_RANK() OVER ( ORDER BY val ) AS densernk ,
        NTILE(100) OVER ( ORDER BY val ) AS ntile100 --分割结果,列子中分了一百组
FROM    Sales.OrderValues;
custid orderid val rownum rnk densernk ntile100
12 10782 12.5 1 1 1 1
27 10807 18.4 2 2 2 1
66 10586 23.8 3 3 3 1
76 10767 28 4 4 4 1
54 10898 30 5 5 5 1
88 10900 33.75 6 6 6 1
48 10883 36 7 7 7 1
41 11051 36 8 7 7 1
71 10815 40 9 9 8 1
38 10674 45 10 10 9 2
53 11057 45 11 10 9 2
75 10271 48 12 12 10 2

3.偏移函数

SELECT  custid ,
        orderid ,
        orderdate ,
        val ,
        LAG(val) OVER ( PARTITION BY custid ORDER BY orderdate, orderid ) AS prev_val ,--显示前一行
        --显示前三行LAG(val, 3),如过值不存在设置默认值为0  LAG(val, 3, 0).
        LEAD(val) OVER ( PARTITION BY custid ORDER BY orderdate, orderid ) AS next_val --显示后一行
FROM    Sales.OrderValues;
custid orderid orderdate val prev_val next_val
1 10643 2007/8/25 814.5 NULL 878
1 10692 2007/10/3 878 814.5 330
1 10702 2007/10/13 330 878 845.8
1 10835 2008/1/15 845.8 330 471.2
1 10952 2008/3/16 471.2 845.8 933.5
1 11011 2008/4/9 933.5 471.2 NULL
2 10308 2006/9/18 88.8 NULL 479.75
2 10625 2007/8/8 479.75 88.8 320
2 10759 2007/11/28 320 479.75 514.4
2 10926 2008/3/4 514.4 320 NULL
3 10365 2006/11/27 403.2 NULL 749.06
3 10507 2007/4/15 749.06 403.2 1940.85
3 10535 2007/5/13 1940.85 749.06 2082
3 10573 2007/6/19 2082 1940.85 813.37
--FIRST_VALUE 和 LAST_VALUE支持window partition,order, and frame clauses.
SELECT  custid ,
        orderid ,
        orderdate ,
        val ,
        FIRST_VALUE(val) OVER ( PARTITION BY custid ORDER BY orderdate, orderid
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW ) AS first_val ,
        LAST_VALUE(val) OVER ( PARTITION BY custid ORDER BY orderdate, orderid
ROWS BETWEEN CURRENT ROW
AND UNBOUNDED FOLLOWING ) AS last_val
FROM    Sales.OrderValues;
custid orderid orderdate val first_val last_val
1 11011 2008/4/9 933.5 814.5 933.5
1 10952 2008/3/16 471.2 814.5 933.5
1 10835 2008/1/15 845.8 814.5 933.5
1 10702 2007/10/13 330 814.5 933.5
1 10692 2007/10/3 878 814.5 933.5
1 10643 2007/8/25 814.5 814.5 933.5
2 10926 2008/3/4 514.4 88.8 514.4
2 10759 2007/11/28 320 88.8 514.4
2 10625 2007/8/8 479.75 88.8 514.4
2 10308 2006/9/18 88.8 88.8 514.4
3 10856 2008/1/28 660 403.2 660
3 10682 2007/9/25 375.5 403.2 660
3 10677 2007/9/22 813.37 403.2 660
3 10573 2007/6/19 2082 403.2 660
时间: 2024-10-12 14:49:55

窗口函数小结的相关文章

[转载] yonken autoit入门教程小结

对于听说过autoit脚本的朋友,下面的入门教程是个不错的教材,建议大家看看 作者: yonken 据我了解需要编写AutoHotkey/AutoIt脚本来实现自动化操作的用户很多都是网管,其它则可能是一些个人用户,他们一般都具有相当的技术水平,而且都希望能借助脚本来完成某些以往需要人工操作的重复性劳动,但限于语言条件上的限制可能对官方的帮助文档有较难理解之处.为方便读者,我将从最简单的说起,每个示例尽可能同时给出相应的AHK和AU3版本代码.本文将尽可能用较通俗的语言描述,但并不打算讲解语法基

SQL Server窗口函数:ROWS与RANGE

原文:SQL Server窗口函数:ROWS与RANGE 几乎每次我展示SQL Server里的窗口时,人们都非常有兴趣知道,当你定义你的窗口(指定的一组行)时,ROWS与RANGE选项之间的区别.因此在今天的文章里我想给你展示下这些选项的区别,对于你的分析计算意味着什么. ROWS与RANGE之间的区别 当你用OVER()子句进行你的分析计算来打开你的窗口,你也可以在窗口里看到的,通过ROWS与RANGE选项来限制你的行数.来看下面的T-SQL语句: 1 SELECT 2 t.OrderYea

unity3d 英保通公开课小结 1-38讲

第二讲:Unity资源管理[持续更新中] 2.1 Unity 资源及资源类型 2.2  模型和角色动画的输出设置 2.3  材质和着色器 2.4  2D 纹理和 Moive纹理 2.5  声音文件 2.6  Asset Store( 资源 Store) 2.7  Prefab( 预设 ) 2.8  Project视窗搜索功能 2.9  资源输入原理( metadata ) 第三.四讲:模型和角色动画的输出 [模型] * 模型主要可以以两种方式进行输出: 1. 使用插件进行输出.并输出为指定的文件

SQL Server 中的窗口函数(2012 新函数)

简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函数的概念. 什么是窗口函数 窗口函数,也可以被称为OLAP函数或分析函数.理解窗口函数可以从理解聚合函数开始,我们知道聚合函数的概念,就是将某列多行中的值按照聚合规则合并为一行,比如说Sum.AVG等等,简单的概念如图1所示. 图1.聚合函数 因此,通常来说,聚合后的行数都要小于聚合前的行数.而对于窗口函数

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

【转载】小结一下linux 2.6内核的四种IO调度算法

在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation.该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作.之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求.NOOP假定I/O请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样).在有些SAN环境下,这个选择可能是最好选择.Noop 对于 IO

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

安卓小结《1》

Activity的生命周期和启动模式的知识点小结: 1.如果Activity切换的时候,新Activity是透明,旧的不会走onStop方法. 2.新的Activity切换的时候,旧Activity  会先执行,onpause,然后才会启动新的activity. 3. Activity在异常情况下被回收时,onSaveInstanceState方法会被回调,回调时机是在onStop之前,当Activity被重新创建的时 候,onRestoreInstanceState方法会被回调,时序在onSt