PL/SQL

SQL进阶教程之1.9 用sql处理数列

2021-11-21  本文已影响0人  anti酱

用法1:生成连续序号
案例1:生成从0-99的连续序号
知识点:00-99中0-9各自出现了20次,出现在个位和十位上分别有10次,将个位和十位组合就可以得到所有数字,排序得到顺序。

表digits 两位数组合

案例2:生成从1-542的连续序号
知识点:1-542可以理解为0-999的一部分,依然是把个/十/百分别自连接+cross join 组合,然后筛选出1-542这一范围

三位数组合

用法2:求全部缺失的编号
案例1:求seqtable表中缺失的编号
知识点:except排除差集/not in/not exists求两者不同部分

表seqtable 找出缺失数值

注意:except也能达到同样效果,但部分数据库如mysql不支持

用法3:找出连续的编号
案例1:找出3个人连在一起的座位
知识点:自连接+not exists双重否定用法

表seats 找出连续的座位

案例2:找出3个人连在一起并且在同一排的座位
知识点:自连接+not exists双重否定用法,增加行序号限定在同一排
bug:原表的是使用预订,建表时错误地写了”预定“和”预订“

表seats2 找到同一排且连续的座位

用法4:找出最长连续的编号多长
案例1:找出连续能坐多少人
知识点:自连接+not exists双重否定用法
思路:
1.先找到所有连续座位的开始和结束位置,用条件限定:
开始和结束位置之间的座位没有预定(条件1)
开始位置前面一个位置已经预定(条件2)
结束位置后面一个位置已经预定(条件3)
2.从第一步的位置里面找到中间座位数最多的记录

表seats3 找到连续座位数最多的座位数量

用法5:单调递增和单调递减
案例1:找出单调递增的时间区间
知识点:自连接+not exists双重否定+max极值函数筛选

表mystock 找出所有单调递增的日期范围
上一篇下一篇

猜你喜欢

热点阅读