设为首页 收藏本站
查看: 1315|回复: 0

[经验分享] SQL SERVER LEAD和LAG使用

[复制链接]

尚未签到

发表于 2017-12-13 19:37:25 | 显示全部楼层 |阅读模式
  示例:获取在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是往前求值

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423777-1-1.html 上篇帖子: SQL Server Alert发送告警邮件少了的原因 下篇帖子: SQL Server 2014 聚集列存储
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表