道一纹字

种一棵树最好的时间是十年前,其次就是现在。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  7 随笔 :: 0 文章 :: 0 评论 :: 10062 阅读

第一部分:语法

位移函数语法如下:

lag(exp_str,offset,defval) over(partition by ..order by …)

lead(exp_str,offset,defval) over(partition by ..order by …)

其中exp_str是字段名

     Offset是偏移量,即是上1个或上N个的值,假设当前行在表中排在第5行,则offset 为3,则表示我们所要找的数据行就是表中的第2行(即5-3=2)。

     Defval默认值,当两个函数取上N/下N个值,当在表中从当前行位置向前数N行已经超出了表的范围时,lag()函数将defval这个参数值作为函数的返回值,若没有指定默认值,则返回NULL,那么在数学运算中,总要给一个默认值才不会出错。

第二部分:实例

以下语句在以下环境均可以执行:sqlserver2014。

场景:几个朋友来到电影院的售票处,准备预约连续空余座位。你能利用表 T0527,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗?

示例数据:

对于如上样例,你的查询语句应该返回如下结果。 

注意:seat_id 字段是一个自增的整数,free 字段是布尔类型('1' 表示空余, '0' 表示已被占据)。连续空余座位的定义是大于等于 2 个连续空余的座位。

示例数据sql: 

复制代码
CREATE TABLE T0527
(
seat_id INT,
free INT
)

INSERT INTO T0527 VALUES 
(1,1),
(2,0),
(3,1),
(4,1),
(5,1)
复制代码

查询sql: 

复制代码
SELECT 
SEAT_ID
FROM 
    (SELECT *,    
    LAG(FREE,1,0)OVER(ORDER BY SEAT_ID) AS LAG_FREE,    
    LEAD(FREE,1,0)OVER(ORDER BY SEAT_ID) AS LEAD_FREE    
    FROM T0527    
    )T
WHERE FREE = 1 AND (FREE = LAG_FREE OR FREE = LEAD_FREE)
复制代码

思路解析:

连续空余座位,那么就是这一行的数据为1并且等于上一行或下一行的数据。

使用位移函数先得到如下结果:

LAG_FREE表示前一行的free数据,LEAD_FREE表示下一行的free数据。此时可以在同一行判断free是否和LAG_FREE和LEAD_FREE相等,同时要过滤掉free为0的数据。

posted on   道一纹字  阅读(2406)  评论(0)    收藏  举报
编辑推荐:
· 为什么说方法的参数最好不要超过4个?
· C#.Net 筑基-优雅 LINQ 的查询艺术
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· 大数据高并发核心场景实战,数据持久化之冷热分离
· 运维排查 | SaltStack 远程命令执行中文乱码问题
阅读排行:
· 博客园众包平台:诚征3D影像景深延拓实时处理方案(预算8-15万)
· 发布一个小功能,通过 markdown 图片语法嵌入B站视频
· 《HelloGitHub》第 111 期
· 谷歌新AI工具杀疯了?免费,但有点坑!Gemini CLI 抢先实测
· Spring AI Alibaba 1.0 正式发布!核心特性速览+老项目升级指南
点击右上角即可分享
微信分享提示