SQLSERVER中LEAD和LAG函数

   SQL SERVER中LEAD和LAG函数

  LEAD和LAG函数

  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不能是负数值或分析函数。

  LAG

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

  下面看一组SQL语句:

  WITH test

  as

  (

  select NULL as score

  UNION ALL

  select 10

  UNION ALL

  select 20

  UNION ALL

  select 30

  UNION ALL

  select 40

  UNION ALL

  select 50

  )

  select ROW_NUMBER() over(order by score) as rownum

  ,score

  ,LEAD(score) over(order by score) as nextscore1

  ,LEAD(score,1) over(order by score) as nextscore2

  ,LEAD(score,1,0) over(order by score) as nextscore3

  ,LEAD(score,2) over(order by score) as nextscore4

  ,LAG(score) over(order by score) as previousscore1

  ,LAG(score,1) over(order by score) as previousscore2

  ,LAG(score,1,0) over(order by score) as previousscore3

  ,LAG(score,2) over(order by score) as previousscore4

  from test

  结果前半部分:

  rownum score nextscore1 nextscore2 nextscore3 nextscore4

  1 NULL 10 10 10 20

  2 10 20 20 20 30

  3 20 30 30 30 40

  4 30 40 40 40 50

  5 40 50 50 50 NULL

  6 50 NULL NULL 0 NULL

  LEAD(score)over(order by score)与LEAD(score,1)over(order by score)相同,基于SCORE升序取下一个score。

  LEAD(score,Y)over(order by score)公式:按score升序排列第X行计算LEAD(score,Y)over(order by score)为第X+Y行的值。

  对第X行求LEAD(score)over(order by score),值为第X+1行的值。见列nextscore1和nextscore2。

  对第X行求LEAD(score,2)over(order by score),值为第X+2行的值。见列nextscore4。

  对于第6行,由于没有第7行数据,所以LEAD求出的值为NULL。如果指定默认值,则返回指定默认值。,如LEAD(score,1,0)最后一行返回0。见netsocre3列。

  结果后半部分:

  rownum score previousscore1 previousscore2 previousscore3 previousscore4

  1 NULL NULL NULL 0 NULL

  2 10 NULL NULL NULL NULL

  3 20 10 10 10 NULL

  4 30 20 20 20 10

  5 40 30 30 30 20

  6 50 40 40 40 30

  跟LEAD非常相似,只是LAG是往前求值。

时间: 2024-09-10 23:39:29

SQLSERVER中LEAD和LAG函数的相关文章

SQLserver中常用日期时间函数

统计在数据库中是最常见也是必不可少的,前段时间用Teechat控件使用统计遇到的一些SQL语句整理一下,重点常用函数有datediff()和datepart(),下面大概讲述下这些函数.  代码如下 复制代码 1.一个月第一天的 Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 3.一年的第一天 Select DATEADD(yy, DA

sqlServer中如何调用自定义函数啊

问题描述 createfunctiondbo.GetName(@idint)returnsnvarchar(10)asbegindeclare@namenvarchar(10)select@name=tsNamefromstudentwhereTSId=@idreturn@nameend上面是我自己写的一个自定义函数,我看了网上的一些调用方法都报错,不知道怎么调用[sql]viewplaincopyprint?还有这一段代码是什么意思 解决方案 解决方案二:你使用"表"的地方,使用函数

sqlserver中字符串切割函数总结

实例1 循环while一个个读取  代码如下 复制代码 ALTER FUNCTION [dbo].[Split] (        @Array VARCHAR(7000)     ,@Split CHAR(1) ) RETURNS @T TABLE(v VARCHAR(100)) AS BEGIN     WHILE(CHARINDEX(@Split,@Array)<>0)           BEGIN             INSERT @T VALUES(SUBSTRING(@Arr

SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数

原文:SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数 SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数  先来创建一个测试表 1 USE [tempdb] 2 GO 3 4 CREATE TABLE #temptb(id INT ,NAME VARCHAR(200)) 5 GO 6 7 INSERT INTO [#temptb] ( [id], [NAME] ) 8 SELECT 1,'

SQLServer中利用NTILE函数对数据进行分组的一点使用

原文:SQLServer中利用NTILE函数对数据进行分组的一点使用 本文出处:http://www.cnblogs.com/wy123/p/6908377.html    NTILE函数可以按照指定的排序规则,对数据按照指定的组数(M个对象,按照某种排序分N个组)进行分组,可以展现出某一条数据被分配在哪个组中. 不仅可以单单利用这个特性,还可以借助该特实现更加有意思的功能. NTILE的基本使用 NTILE的作用是对数据进行整体上的分组,比如有60个学生,按照成绩分成"上中下"三个级

oracle中110个常用函数介绍_oracle

1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual; A A ZERO SPACE --------- --------- --------- --------- 65 97 48 32 2. CHR 给出整数,返回对应的字符; SQL> select chr(54740) zhao,chr(65) chr65 from dual; ZH C --

oracle-在线等 有关对(lag函数)的使用或者其他的函数可以达到目的的也可以

问题描述 在线等 有关对(lag函数)的使用或者其他的函数可以达到目的的也可以 在一张日历表中有一个字段名称为ISOM只存在两个数值,0的意思代表不是交易日,1的意思代表交易,另外有一个字段TIME就是按顺序来的日期,怎样凑出第三个字段C这个字段的意思是,如果ISOM为0,则要取上一个最近的标为1的日期,如果为1,就取当天的日期 (在ORACLE里面执行) 解决方案 发让人让人人反反复复 解决方案二: create table test_date( t_TIME varchar(20) t_IS

我是如何在SQLServer中处理每天四亿三千万记录的

首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. 项目背景 这是给某数据中心做的一个项目,项目难度之大令人发指,这个项目真正的让我感觉到了,商场如战场,而我只是其中的一个小兵,太多的战术,太多的高层之间的较量,太多的内幕了.具体这个项目的情况,我有空再写相关的博文出来. 这个项目是要求做环境监控,我们暂且把受监控的设备称为采集设备,采集设备的属性

sqlserver-用 Isnumeric判断从SQLServer中取出的数据类型为numeric的数据返回值是False是为什么

问题描述 用 Isnumeric判断从SQLServer中取出的数据类型为numeric的数据返回值是False是为什么 之前在sybase环境时使用的是自动采番功能,现在移到SQLServer环境就想用取得最大值然后加一的方法实现插入. 因为本来就有写好的取得最大值的函数所以就拿来直接用了,在+1之前要用Isnumeric()判断是否为数字. Isnumeric(从数据库取出的值) 用response.write显示从数据库取出来的值是3565613, 用response.write Isnu