LeetCode刷题之连续出现的数字

连续出现的数字(Consecutive Numbers)

题目

ConsecutiveNumbers

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 – 最后一行

  • 注意事项

    1. 当开窗函数over()出现分组(partition by)子句时,unbounded preceding即第一行是指表中一个分组里的第一行, unbounded following即最后一行是指表中一个分组里的最后一行

    2. 当开窗函数over()省略了分组(partition by)子句时, unbounded preceding即第一行是指表中的第一行, unbounded following即最后一行是指表中的最后一行

    3. 窗口子句不能单独出现,必须有order by子句时才能出现

参考链接

https://blog.csdn.net/gonewithwind818/article/details/95610893

https://blog.csdn.net/myflysun/article/details/70477204
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值