sql开窗函数 第一部分:语法 位移函数语法如下: 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的数据。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/36505.html