本篇分享一道来自于leetcode中文版第180题,关于SQL处理连续性的题目。

原题目:编写一个 SQL 查询,查找所有至少连续出现三次的数字

数据表Logs如下:

ID Num
1 1
2 1
3 1
4 2
5 1
6 2
7 2

需要得到的结果为:

ConsecutiveNums
1

注:本题中,1是唯一连续出现至少三次的数字。

思路1 将数据表自连接,根据ID递增、数值相等的条件进行筛选

先上官方提供的参考代码:

SELECT DISTINCTl1.Num AS ConsecutiveNums
FROMLogs l1,Logs l2,Logs l3
WHEREl1.Id = l2.Id - 1AND l2.Id = l3.Id - 1AND l1.Num = l2.NumAND l2.Num = l3.Num

解读:先将原数据表进行两次的自连接,形成7*7*7的数据表,再根据ID递增(l1→l2→l3逐个+1)与数值相等作为过滤条件,最后对得到的Num进行去重处理。

注:这种方法比较直接和简单,但是也有一些明显的缺点,如数据表行列过长且要求连续出现的次数比较大时,自连接后的数据表计算量大大增加;当没有ID列或者ID列不连续时,还需要添加一列自增列进行辅助。

思路2 定义变量,利用变量遍历Num列,计算连续次数

代码:

SELECT DISTINCT Num AS ConsecutiveNums
FROM(SELECT  ID,Num,IF(@a=Num,@b:=@b+1,@b:=1) AS `count`,@a:=NumFROM Logs JOIN (SELECT @a:=0,@b:=0) c
)t
WHERE `count`>=3;

解读:首先定义并初始化两个变量,其中变量@a用于赋值每一个Num,目的是为了比较前后行的Num是否相等;变量@b用于赋值连续的次数,当@a与上一行Num数值相等时,则+1,否则从1重新算起;最后再根据count值大于等于3,对数据进行过滤和去重。

注:得到的中间数据表t为:

思路 3 利用对ID排名与Num分组排名间的差值相等,来计算连续次数

代码:

SELECT DISTINCT Num AS ConsecutiveNums
FROM (SELECT Num,count(1) AS `count`FROM (SELECT ID,Num,ROW_NUMBER() OVER(ORDER BY ID) - ROW_NUMBER() OVER(PARTITION BY Num ORDER BY ID) AS `sub`FROM `logs`) t1GROUP BY Num,`sub`HAVING count(1) >= 3 ) t2

解读:先看t1表,其中最重要的是这条语句

ROW_NUMBER() OVER(ORDER BY ID) - ROW_NUMBER() OVER(PARTITION BY Num ORDER BY ID)

意思是先按照ID给列进行排名(这样做的意思在于就算ID不连续也可以计算),然后再根据Num为分组项、ID为排名项进行分组排名,将两者相减,得到的是:

可以看出,当Num连续的时候,相减值sub会相等,因此可以用Num和sub作为分组列,进行计数,大于等于3的组即为所求对应数据。

公众号同步更新Excel、SQL、Python相关的知识,喜欢的朋友可以关注、收藏、点赞走一波哟,下篇再会~

sql 差值_SQL_LeetCode的连续性题目相关推荐

  1. sql 差值_使用Blink CEP实现差值聚合计算

    简介: 本文介绍通过CEP实现实时流上的差值聚合计算. 使用Blink SQL+UDAF实现差值聚合计算介绍了如何使用Blink SQL+UDAF实现实时流上的差值聚合计算,后来在与@付典就业务需求和 ...

  2. 使用Blink SQL+UDAF实现差值聚合计算

    本案例根据某电网公司的真实业务需求,通过Blink SQL+UDAF实现实时流上的差值聚合计算,通过本案例,让读者熟悉UDAF编写,并理解UDAF中的方法调用关系和顺序. 感谢@军长在实现过程中的指导 ...

  3. mysql中日期怎样求差_在Sql语句中怎样计算出两个日期的差值

    展开全部 sql语句中计算两个日期的差值用32313133353236313431303231363533e4b893e5b19e31333365643662datediff函数. 工具:sqlser ...

  4. Oracle数据库Timestamp数据差值计算Sql语句

    今天的工作中遇到一个问题,需要计算数据库中两个时间字段的差值,字段类型是timestamp,将字段直接相减,会得到timestamp类型的结果值,不是我想要的number类型的值.在网上找了一些方法, ...

  5. SQL SERVER 获取差值最小的数据

    分享一个小技巧,获取和自己差值最小的数据,测试数据如下: --测试数据 if not object_id(N'Tempdb..#T1') is nulldrop table #T1 Go Create ...

  6. SQL之一种通用的连续性问题处理方法【重分组算法】--HiveSQL面试题33

    目录 0 需求分析 1 数据准备 2 数据分析 3 小 结 0 需求分析 数据如下: wang 2020-05-01 wang 2020-05-01 wang 2020-05-01 wang 2020 ...

  7. mysql+两行+一样+筛选_MySQL计算相邻两行某列差值的方法

    简述 博主最近因工作任务缠身,都无暇顾及到我的这片自留地了.前段时间稍有空闲,花了较多的精力学习<啊哈算法>,从中学习到很多之前没有太注重的内容,收益颇丰.但是这些算法题目还没有看完,等后 ...

  8. mysql 取差值_MySQL计算相邻两行某列差值的方法

    简述 博主最近因工作任务缠身,都无暇顾及到我的这片自留地了.前段时间稍有空闲,花了较多的精力学习<啊哈算法>,从中学习到很多之前没有太注重的内容,收益颇丰.但是这些算法题目还没有看完,等后 ...

  9. mysql查询每小时数据和上小时数据的差值

    一.前言 需求是获取某个时间范围内每小时数据和上小时数据的差值以及比率.本来以为会是一个很简单的sql,结果思考两分钟发现并不简单,网上也没找到参考的方案,那就只能自己慢慢分析了. 刚开始没思路,就去 ...

最新文章

  1. sm4 的s盒_SM4国密算法Java版
  2. HMAC算法及其应用
  3. 思科IPS系统的bypass mode
  4. Vue移动端项目——字体图标的使用
  5. 从Java程序员进阶到架构师,6大核心技能要领详解
  6. scrapy 整合 djangoitem,摆脱保存数据时SQL报错的困扰
  7. poj3461kmp
  8. What's new in C# from 2.0 to 5.0
  9. MacOS磁盘工具:如何将“校验和..“添加到磁盘映像
  10. 50道CSS基础面试题(附答案)
  11. 【U+】U+通用财务数据库测试失败,无法保存。
  12. MySQL的sql大于号(小于号)的使用
  13. 用户活跃、留存、流失,终于讲清楚了!
  14. 记录一次心脏滴血靶场实验过程
  15. 同步或者重构Activiti Identify用户数据的多种方案比较
  16. New Year Snowmen(贪心)
  17. 【数模/预测】灰色预测
  18. c语言考试排座位系统源程序,c语言_排考场座位问题:.doc
  19. 【RabbitMQ】java.lang.NoClassDefFoundError: org/springframework/util/backoff/BackOff
  20. 5G消息应用号推荐|官方种草清单第六期

热门文章

  1. (转)C#读写共享文件
  2. POJ - 3190
  3. ios隐藏导航栏底线条和导航、状态栏浙变色
  4. leetcode 之Rotate List(18)
  5. ajax前台值传到后台
  6. 通过SharpShell快速实现Windows Shell扩展
  7. Java字符编码知识简介
  8. Oracle数据库在.net连接问题总结
  9. 1 MySQL 主从同步
  10. Ubuntu中DenyHosts清除黑名单IP地址