LeetCode刷题之连续出现的数字
LeetCode刷题之连续出现的数字
连续出现的数字(Consecutive Numbers)
题目
SQL脚本
-
思路分析
-
MySQL
SELECT DISTINCT l1.Num AS ConsecutiveNums FROM Logs l1, Logs l2, Logs l3 WHERE l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1 AND l1.Num = l2.Num
-
Oracle
--利用lag函数向前查询这个id_new前2行记录的值是否于源id列的值相等,如果相等即有三个连续的值,这里我没有指定第三列的M的值默认为null SELECT DISTINCT(Num) AS Num FROM (SELECT Num,id,lag(id,2) OVER(partition by num order by id) AS id_new FROM logs) A WHERE A.id = A.id_new + 2
其他
Oracle分析函数
-
概念
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。
-
聚合函数与分析函数区别
普通的聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值。
-
语法
分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,他们的使用形式如下:over(partition by xxx order by yyy rows between zzz)
常用分析函数
lag()与lead()
-
概念
求之前或之后的第N行。lag和lead函数可以在一次查询中取出同一字段的前n行的数据和后n行的值,该操作可以使用对相同表的表连接来实现,不过使用lag和lead有更高的效率 -
语法
lag(arg1,arg2,arg3)
第一个参数是列名, 第二个参数是偏移的offset, 第三个参数是超出记录窗口时的默认值
-
详解
lag(列名,n,m): 当前记录前面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录前面第一行的记录<列名>的值,没有则默认值为null。
over()开窗函数
-
概念
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化
-
详解
开窗函数over()包含三个分析子句:分组子句(partition by), 排序子句(order by), 窗口子句(rows)
rows窗口子句
-
常用属性
unbounded preceding – 第一行
current row – 当前行
unbounded following – 最后一行
-
注意事项
-
当开窗函数over()出现分组(partition by)子句时,unbounded preceding即第一行是指表中一个分组里的第一行, unbounded following即最后一行是指表中一个分组里的最后一行
-
当开窗函数over()省略了分组(partition by)子句时, unbounded preceding即第一行是指表中的第一行, unbounded following即最后一行是指表中的最后一行
-
窗口子句不能单独出现,必须有order by子句时才能出现
-
参考链接
https://blog.csdn.net/gonewithwind818/article/details/95610893
https://blog.csdn.net/myflysun/article/details/70477204
上一篇: ABP开发手记1 - 开篇
下一篇: 一定要让孩子改掉这些坏习惯