SQL SERVER LEAD和LAG使用
示例:获取在48小时之内重复的记录
- SELECT *
- FROM ( SELECT b.* ,
- LAG(b.OperatorTime, 1, b.OperatorTime) OVER ( PARTITION BY b.No ORDER BY b.OperatorTime ) AS BeforTime ,
- LEAD(b.OperatorTime, 1, b.OperatorTime) OVER ( PARTITION BY b.No ORDER BY b.OperatorTime ) AS NextTime
- FROM Test b
- ) a
- WHERE DATEDIFF(HH, a.BeforTime, a.OperatorTime) < 24
- AND DATEDIFF(HH, a.OperatorTime, a.NextTime) < 24
- AND a.No IN ( SELECT c.No
- FROM dbo.Test c
- GROUP BY c.No
- HAVING COUNT(c.No) > 1 )
LAG函数:
作用:访问相同结果集中先前行的数据,而用不使用 SQL Server 2016 中的自联接。 LAG 以当前行之前的给定物理偏移量来提供对行的访问。 在 SELECT 语句中使用此分析函数可将当前行中的值与先前行中的值进行比较。
语法:
LAG (scalar_expression [,offset] [,default])
OVER ( [ partition_by_clause ] order_by_clause )
参数:
scalar_expression
要根据指定偏移量返回的值。 这是一个返回单个(标量)值的任何类型的表达式。 scalar_expression不能为分析的函数。
偏移量
当前行(从中获得取值)后的行数。 如果未指定,则默认值为 1。 偏移量可以是列、 子查询或计算结果为正整数其他表达式或可以隐式转换为bigint。 偏移量不能为负值或分析函数。
默认值
要返回时的值scalar_expression在偏移量为 NULL。 如果未指定默认值,则返回 NULL。 默认可以是列、 子查询或其他表达式,但不是能为分析的函数。 默认必须是类型兼容与scalar_expression。
通过( [ partition_by_clause ] order_by_clause)
partition_by_clause将划分为分区函数应用到的 FROM 子句生成的结果集。 如果未指定,则此函数将查询结果集的所有行视为单个组。 order_by_clause应用函数之前确定数据的顺序。 如果partition_by_clause指定,它确定分区中的数据的顺序。 Order_by_clause是必需的。
SELECT-OVER 子句:
作用:在应用关联的开窗函数前确定行集的分区和排序。 也就是说,OVER 子句定义查询结果集内的窗口或用户指定的行集。 然后,开窗函数将计算窗口中每一行的值。 您可以将 OVER 子句与函数一起使用,以便计算各种聚合值,例如移动平均值、累积聚合、运行总计或每组结果的前 N 个结果。
例子:
- SELECT SalesOrderID, ProductID, OrderQty
- ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Total
- ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Avg"
- ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Count"
- ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Min"
- ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Max"
- FROM Sales.SalesOrderDetail
- WHERE SalesOrderID IN(43659,43664);
- SalesOrderID ProductID OrderQty Total Avg Count Min Max
- ------------ ----------- -------- ----------- ----------- ----------- ------ ------
- 43659 776 1 26 2 12 1 6
- 43659 777 3 26 2 12 1 6
- 43659 778 1 26 2 12 1 6
- 43659 771 1 26 2 12 1 6
- 43659 772 1 26 2 12 1 6
- 43659 773 2 26 2 12 1 6
- 43659 774 1 26 2 12 1 6
- 43659 714 3 26 2 12 1 6
- 43659 716 1 26 2 12 1 6
- 43659 709 6 26 2 12 1 6
- 43659 712 2 26 2 12 1 6
- 43659 711 4 26 2 12 1 6
- 43664 772 1 14 1 8 1 4
- 43664 775 4 14 1 8 1 4
- 43664 714 1 14 1 8 1 4
- 43664 716 1 14 1 8 1 4
- 43664 777 2 14 1 8 1 4
- 43664 771 3 14 1 8 1 4
- 43664 773 1 14 1 8 1 4
- 43664 778 1 14 1 8 1 4
LEAD:
访问相同结果集的后续行中的数据,而不使用 SQL Server 2012 中的自联接。 LEAD 以当前行之后的给定物理偏移量来提供对行的访问。 在 SELECT 语句中使用此分析函数可将当前行中的值与后续行中的值进行比较。
语法:LEAD ( scalar_expression [ ,offset ] , [ default ] ) OVER ( [ partition_by_clause ] order_by_clause )
scalar_expression,要返回的值基于指定的偏移量。 这是一个返回单个(标量)值的任何类型的表达式。scalar_expression 不能为分析函数
offset默认值为1, offset 可以是列、子查询或其他求值为正整数的表达式,或者可隐式转换为bigint。offset 不能是负数值或分析函数。
default默认值为NULL, offset 可以是列、子查询或其他求值为正整数的表达式,或者可隐式转换为bigint。offset不能是负数值或分析函数。
LEAD和LAG非常相似,只是LAG是往前求值
SQL SERVER LEAD和LAG使用的更多相关文章
- [转]SQL Server 2012 的 T-SQL 新功能 – 新的数据分析函数(LEAD、LAG)
当您需要在 SQL Server 中利用 T-SQL 比较结果集的每一列跟前一列或后一列的差异时,在过去可能需要利用 CURSOR 搭配临时表变量,或是透过递归 CTE 来达到这个效果,如今 SQL ...
- SQL Server 2012中LEAD函数简单分析
LEAD函数简单点说,就是把下一行的某列数据提取到当前行来显示,看示例更能解释清楚,先看测试用脚本 DECLARE @TestData TABLE( ID INT IDENTITY(1,1), Dep ...
- SQL Server中的窗口函数
简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函 ...
- SQL Server 日常维护经典应用
SQL Server日常维护常用的一些脚本整理. 1.sql server开启clr权限: GO RECONFIGURE GO ALTER DATABASE HWMESTC SET TRUSTWORT ...
- SQL Server 分析函数和排名函数
分析函数基于分组,计算分组内数据的聚合值,经常会和窗口函数OVER()一起使用,使用分析函数可以很方便地计算同比和环比,获得中位数,获得分组的最大值和最小值.分析函数和聚合函数不同,不需要GROUP ...
- SQL SERVER 数据库面试题
1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name kecheng fenshu 张三 语文 81张三 数学 75李四 语文 ...
- SQL Server 2012/2016/2017 新增函数
/************************************************************** SQL Server 2012 新增的函数 ************** ...
- SQL Server Window Function 窗体函数读书笔记一 - SQL Windowing
SQL Server 窗体函数主要用来处理由 OVER 子句定义的行集, 主要用来分析和处理 Running totals Moving averages Gaps and islands 先看一个简 ...
- SQL server高级语法
1. 公共表达式CTE 公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE.递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达 ...
随机推荐
- nyoj 949哈利波特(细节题)
哈利波特 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 Harry 新学了三种魔法.他能够用第一种魔法把 a 克的沙子变成 b 克金属,能够用另外一种魔法把 c 克 ...
- js课程 1-2 js概念
js课程 1-2 js概念 一.总结 一句话总结:js标签元素也是js对象,有属性和方法,方法就是事件,属性就是标签属性,可以直接调用. 1.js中如何获取标签对象? getElement获取的是标 ...
- bash - trap
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html The syntax for the trap statement is s ...
- 【84.62%】【codeforces 552A】Vanya and Table
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- GlobalMemoryStatus 和 GlobalMemoryStatusEx
1.获取系统内存信息有2个api,分别是GlobalMemoryStatus和GlobalMemoryStatusEx.GlobalMemoryStatus函数可以在C语言里直接调用,但是Global ...
- 判断系统64位(使用GetNativeSystemInfo函数,XP时代就有这个函数了)
判断系统64位 static bool IsWin64 (void) { SYSTEM_INFO si = {0}; typedef void (WINAPI *LPFN_PGNSI)(LPSYSTE ...
- while 常见程序逻辑
1. 查找 List L; Position P = L; while (P && P->Element != Key) { P = P->Next; } return P ...
- Erlang Process input queue
http://www.cnblogs.com/me-sa/archive/2011/11/05/erlang0012.html Erlang进程有自己的消息队列来保存接收到的消息,新接收到的消息放在队 ...
- 战略游戏 - 树型DP
传送门 题目分析 题意:给一颗无根树,选择最少的节点将所有的边覆盖. 经典的树型DP,dp[i][0/1]表示选择或不选择i号节点的最优值. 当选择了i号节点,他的子节点可选可不选,选择最优的. 当不 ...
- 【9206】 奖学金(NOIP2007)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成 ...