mysql至少连续出现3次的数字_查找至少连续出现三次的所有数字/连续3天的日期【LeetCode】...

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

+----+-----+

| Id | Num |

+----+-----+

| 1 | 1 |

| 2 | 1 |

| 3 | 1 |

| 4 | 2 |

| 5 | 1 |

| 6 | 2 |

| 7 | 2 |

+----+-----+

【1】sql server优质解法:

【1.1】连续3次以上出现的数字

CREATE TABLE #A

(

id INT IDENTITY(1,1),

val INT

)

INSERT INTO #A(val) VALUES(1),(1),(1),(1),(2),(2),(3),(4),(4),(4),(4),(4)

INSERT INTO #A(val) VALUES(1)

select * from #A

SELECT val,MIN(id) AS minid,MAX(id) AS maxid, COUNT(1) AS cmd FROM

(

SELECT *,id-ROW_NUMBER() OVER( PARTITION BY val ORDER BY id ) AS idx FROM #A

) S GROUP BY val,idx

fb9fade18d3212f5f1671b4f83acc812.png

【1.2】连续出现的日期:(比如,想要查询连续登录超过3天的用户)

CREATE TABLE #b

(

id INT IDENTITY(1,1),

userid INT,

login_time datetime

)

INSERT INTO #b(userid,login_time)VALUES(101,''),(102,'')

INSERT INTO #b(userid,login_time)VALUES(102,'')

INSERT INTO #b(userid,login_time)VALUES(101,''),(102,'')

INSERT INTO #b(userid,login_time)VALUES(101,''),(102,'')

INSERT INTO #b(userid,login_time)VALUES(101,''),(102,'')

INSERT INTO #b(userid,login_time)VALUES(101,'')

INSERT INTO #b(userid,login_time)VALUES(101,'')

INSERT INTO #b(userid,login_time)VALUES(101,'')

SELECT * FROM #b ORDER BY userid ,login_time

--解答

SELECT userid, MIN(login_time) AS StartDate, MAX(login_time) AS EndDate, COUNT(1) AS DayCount

FROM (

SELECT userid

,login_time

,DATEADD(dd, -ROW_NUMBER() OVER ( PARTITION BY userid ORDER BY login_time), login_time) AS Grp

FROM #b

) AS T

GROUP BY userid, [Grp]

ORDER BY 1

ca5e14bc8e594ceac9ea6c3b2deaf024.png

【2】mysql办法解决

【2.1】连续时间(比如,想要查询连续登录超过3天的用户)

(8.0以前,8.0以后可以用上述sql server 办法)

测试代码

-- 测试数据代码

CREATE TABLE b

(

id INT primary key auto_increment,

userid INT,

login_time datetime

);

-- select * from b order by userid;

INSERT INTO b(userid,login_time) VALUES(101,''),(102,'');

INSERT INTO b(userid,login_time) VALUES(101,''),(102,'');

INSERT INTO b(userid,login_time) VALUES(101,''),(102,'');

INSERT INTO b(userid,login_time) VALUES(101,''),(102,'');

INSERT INTO b(userid,login_time) VALUES(101,''),(102,'');

INSERT INTO b(userid,login_time) VALUES(101,'');

INSERT INTO b(userid,login_time) VALUES(101,'');

INSERT INTO b(userid,login_time) VALUES(101,'');

INSERT INTO b(userid,login_time) VALUES(101,'');

INSERT INTO b(userid,login_time) VALUES(101,'');

INSERT INTO b(userid,login_time) VALUES(101,'');

INSERT INTO b(userid,login_time) VALUES(102,'');

插入后生成的测试表数据:

14395f94022838651bd26547043fe53f.png

实现代码:

select userid,min(login_time) min_date,max(login_time) max_date,count(1) as day_count

from (

select b.*,

date_add(login_time,interval -if(@group_str=userid,@num:=@num+1,@num:=1) day) as login ,

@group_str:=userid as temp

from b cross join (select @num:=0,@group_str=-1) t

order by b.userid,login_time

) t

group by userid,login

结果:

bc09656797469e2a898716f2b994f769.png

【2.2】连续3次以上出现的数字

强烈推荐解法三

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

+----+-----+

| Id | Num |

+----+-----+

| 1 | 1 |

| 2 | 1 |

| 3 | 1 |

| 4 | 2 |

| 5 | 1 |

| 6 | 2 |

| 7 | 2 |

+----+-----+

-- 建表

create table Logs(id int primary key auto_increment,num int);

-- 造数据

INSERT INTO Logs(num) VALUES(1),(1),(1),(1),(2),(2),(3),(4),(4),(4),(4),(4),(1);

mysql解法:

这道题给了我们一个Logs表,让我们找Num列中连续出现相同数字三次的数字,那么由于需要找三次相同数字,所以我们需要建立三个表的实例.

我们可以用l1分别和l2, l3内交,l1和l2的Id下一个位置比,l1和l3的下两个位置比,然后将Num都相同的数字返回即可:

解法一:

SELECT DISTINCT l1.Num FROM Logs l1

JOIN Logs l2 ON l1.Id = l2.Id - 1

JOIN Logs l3 ON l1.Id = l3.Id - 2

WHERE l1.Num = l2.Num AND l2.Num = l3.Num;

acfb136de190031ea5e603f05352cb8e.png

aef75665ab5a6f2dc441f084cf466477.png

下面这种方法没用用到Join,而是直接在三个表的实例中查找,然后把四个条件限定上,就可以返回正确结果了:

解法二:

SELECT DISTINCT l1.Num FROM Logs l1, Logs l2, Logs l3

WHERE l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1

AND l1.Num = l2.Num AND l2.Num = l3.Num;

再来看一种画风截然不同的方法,用到了变量count和pre,分别初始化为0和-1,然后需要注意的是用到了IF语句,MySQL里的IF语句和我们所熟知的其他语言的if不太一样,相当于我们所熟悉的三元操作符a?b:c,若a真返回b,否则返回c,具体可看这个帖子。那么我们先来看对于Num列的第一个数字1,pre由于初始化是-1,和当前Num不同,所以此时count赋1,此时给pre赋为1,然后Num列的第二个1进来,此时的pre和Num相同了,count自增1,到Num列的第三个1进来,count增加到了3,此时满足了where条件,t.n >= 3,所以1就被select出来了,以此类推遍历完整个Num就可以得到最终结果:

解法三:

SELECT DISTINCT Num FROM (

SELECT Num, @count := IF(@pre = Num, @count + 1, 1) AS n, @pre := Num

FROM Logs, (SELECT @count := 0, @pre := -1) AS init

) AS t WHERE t.n >= 3;

e380ed38e67603be052ab451dcde2a04.png

递推,求至少连续放置三个U的危险组合

UVA580-Critical Mass 题意 有两种方块,L和U,有至少三个连续的U称为危险组合,问有多少个危险组合 solution: 至少这个概念比较难求 ,所以转化为(1ll<

剑指Offer(三十七):数字在排序数组中出现的次数

剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

连续子数组的最大乘积及连续子数组的最大和(Java)

1. 子数组的最大和 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.例如数组:arr[]={1, 2, 3, -2, ...

opencv学习之路(24)、轮廓查找与绘制(三)——凸包

一.简介 二.绘制点集的凸包 #include using namespace cv; void main() { //---绘制点集的凸包 Mat ...

python 练习题1--打印三位不重复数字

题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码 ...

【控制系统数字仿真与CAD】实验三:离散相似法数字仿真

一.实验目的 1. 了解离散相似法的基本原理 2. 掌握离散相似法仿真的基本过程 3. 应用离散相似法仿真非线性系统 4. MATLAB实现离散相似法的非线性系统仿真 5. 掌握SIMULINK仿真方 ...

Word 查找替换高级玩法系列之 -- 给数字批量添加空格和下划线

Word中的查找和替换是一个很强大的功能,很多人都在使用这项功能.查找和替换,顾名思义就是说,查找到符合条件的内容,然后将那些内容替换成我们所需要的内容.下面,我们就通过实例来了解一下查找和替换功能, ...

Python学习笔记(三)Python基本数字类型及其简单操作(1)

一.数字类型 表示数字或数值的数据类型称为数字类型,Python语言提供3种数字类型:整数.浮点数和复数,分别对应数学中的整数.实数和复数,下面就一起来了解一下他们吧! 1.整数类型 整数类型与数学中 ...

随机推荐

Using GET&lowbar;APPLICATION&lowbar;PROPERTY in Oracle D2k Forms

Using GET_APPLICATION_PROPERTY in Oracle D2k Forms DescriptionReturns information about the current ...

Material

renderer.material  物理材质 实现二维图上的人物动作 新建Material,选择Shader(著色器)为transparent/diffuse(背景透明),将上图拉到背景图选项中. ...

物理地址 &equals; 段地址&ast;10H &plus; 偏移地址

程序如何执行: CPU先找到程序在内存中的入口地址 -- 地址总线 (8086有20根地址总线,每一根可以某一时传0或1, 20位的二进制数字可以表示的不同的数字的个数是2^20=1048576 10 ...

nest &&num;39&semi;for&&num;39&semi; loop&period;

/* nest for loop demo. Note that,'upside' triangle controls 'inner condition'. */ import kju.print.P ...

ASP&period;NET菜鸟之路之Request小例子

背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. Request获取值 Request获取值有两种 ...

Java与面向对象之随感(1)

大一下学期上完了c++课程,当时自我感觉很良好,认为对面向对象编程已经是身经百战了,但是上了院里HuangYu老师的Java课之后,才发现自己对于面向对象的编程风格的理解只在皮毛,着实惭愧不已. 假设 ...

Next week plan

1.get a job 2.write a high performance chatroom with encryption.  Use scala. Next Week turn to Rust

CentOS 使用SMB服务 让windows能够上传文件

1. 新增加用户 useradd zhaobsh 2. 使用 pdbedit的方式新增加用户 pdbedit -a -u zhaobsh 3. 修改smb服务 systemctl restart sm ...

postman提取接口的返回值及动态设置变量(一)

一.提取接口返回值   1.当返回值是返回JSON时 let json = JSON.parse(responseBody); // responseBody是包含整个返回内容的字符串 let foo ...

【agc003E】Sequential operations on Sequence

Portal -->agc003E Description 给你一个数串\(S\),一开始的时候\(S=\{1,2,3,...,n\}\),现在要对其进行\(m\)次操作,每次操作给定一个\(a ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值