编写一个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

(

idINT IDENTITY(1,1),

valINT)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

) SGROUP BY val,idx

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

CREATE TABLE#b

(

idINT IDENTITY(1,1),

useridINT,

login_timedatetime)INSERT INTO #b(userid,login_time)VALUES(101,'20180801'),(102,'20180801')INSERT INTO #b(userid,login_time)VALUES(102,'20180802')INSERT INTO #b(userid,login_time)VALUES(101,'20180803'),(102,'20180803')INSERT INTO #b(userid,login_time)VALUES(101,'20180804'),(102,'20180804')INSERT INTO #b(userid,login_time)VALUES(101,'20180805'),(102,'20180805')INSERT INTO #b(userid,login_time)VALUES(101,'20180806')INSERT INTO #b(userid,login_time)VALUES(101,'20180807')INSERT INTO #b(userid,login_time)VALUES(101,'20180809')SELECT * FROM#bORDER BYuserid ,login_time

--解答SELECT userid, MIN(login_time) AS StartDate, MAX(login_time) AS EndDate, COUNT(1) ASDayCountFROM(SELECTuserid

,login_time

,DATEADD(dd, -ROW_NUMBER() OVER ( PARTITION BY userid ORDER BY login_time), login_time) ASGrpFROM#b

)ASTGROUP BY userid, [Grp]

ORDER BY 1

【2】mysql办法解决

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

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

测试代码

--测试数据代码

CREATE TABLEb

(

idINT primary keyauto_increment,

useridINT,

login_timedatetime);--select * from b order by userid;

INSERT INTO b(userid,login_time) VALUES(101,'20180801'),(102,'20180801');INSERT INTO b(userid,login_time) VALUES(101,'20180802'),(102,'20180802');INSERT INTO b(userid,login_time) VALUES(101,'20180803'),(102,'20180803');INSERT INTO b(userid,login_time) VALUES(101,'20180804'),(102,'20180804');INSERT INTO b(userid,login_time) VALUES(101,'20180805'),(102,'20180805');INSERT INTO b(userid,login_time) VALUES(101,'20180806');INSERT INTO b(userid,login_time) VALUES(101,'20180807');INSERT INTO b(userid,login_time) VALUES(101,'20180808');INSERT INTO b(userid,login_time) VALUES(101,'20180809');INSERT INTO b(userid,login_time) VALUES(101,'20180810');INSERT INTO b(userid,login_time) VALUES(101,'20180731');INSERT INTO b(userid,login_time) VALUES(102,'20180731');

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

实现代码:

select userid,min(login_time) min_date,max(login_time) max_date,count(1) asday_countfrom(select b.*,

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

from b cross join (select @num:=0,@group_str=-1) torder byb.userid,login_time

) tgroup by userid,login

结果:

【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;

下面这种方法没用用到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;

mysql如何做连续3天查询_查找至少连续出现三次的所有数字/连续3天的日期【LeetCode】...相关推荐

  1. mysql最近7天销售额_mysql查询近七天、近三十天、近年(按月份)的所有统计数据...

    目录 在做统计表的时候,需要用mysql查询近7天的数据,当某一天数据为0的时候也需要返回 主要用到: infull函数 union interval函数 date_sub函数infull函数:inf ...

  2. php mysql复杂查询_PHP MySQL如何做更复杂的查询

    我有一个模块,我已经创建了使用PHP,jQuery和MySQL来搜索并返回结果. 我在数据库中有两个表格,我试图从项目和客户端拉取.在项目表中保存一个Client_ID. 现在我试图检索clientN ...

  3. Oracle/MySQL数据库的表间关联查询_多表关联查询的SQL语句详解

    文章目录 内连接 inner join 示例 外连接 outer join left outer join 左外连接 示例 right outer join 右外连接 示例 full outer jo ...

  4. mysql哪些xss要转译查询_转义字符的妙用不用引号的字符注入和XSS脚本安全 -电脑资料...

    声明:本文纯属YY,如有扯淡之处,请告诉小菜俺 THX 在字符型填字游戏中,'和"往往是决定能否跳出约束进行攻击的关键,于是出现鸟转义字符 \ ,可以把' "变成残废....这恰恰帮助我们改变了字符内 ...

  5. 分解连续自然数的和_【编程练习】正整数分解为几个连续自然数之和

    题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...

  6. python mysql 分页_利用python对mysql表做全局模糊搜索并分页实例

    在写django项目的时候,有的数据没有使用模型管理(数据表是动态添加的),所以要直接使用mysql.前端请求数据的时候可能会指定这几个参数:要请求的页号,页大小,以及检索条件. "&quo ...

  7. mysql union查询_一本彻底搞懂MySQL索引优化EXPLAIN百科全书

    MySQL逻辑架构介绍 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...

  8. mysql 关联查询_响应时间长?MySQL查询优化教程来了!

    - 点击上方"爱数据学习社"关注我们吧! - 为什么查询会慢?--响应时间过长. 如果把查询看做是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询, ...

  9. mysql超长sql查询_超长SQL怎么查询?MySQL列长度限制有哪些 | 学步园

    MySQL字符串的限制长度看似重要性不要,其实和整个MySQL数据库的安全性是息息相关的,很值得我们去深入研究分析.SQL注入攻击一直都在被广泛的讨论,然而人们却忽略了今天我将要介绍的这两个安全隐患, ...

最新文章

  1. Thecus色卡司1U机架式网络存储服务器
  2. 1.java注释的类型_HappyBKs教你写Java注解(1)——注解的分类、运行机制、作用域及概念汇总...
  3. 超经典动态规划题:最大子序和
  4. 【实施工程师之家】——mysql四种索引PRIMARY(主键索引)、INDEX(一般索引)、UNIQUE(非空索引)、FULLTEXT(全文索引)应用
  5. 二维数组foreach嵌套遍历,判断连续3天以上的算有效数据
  6. mysql proxy 主从_【MYSQL知识必知必会】MySQL主从复制读写分离(基于mysql-proxy实现)...
  7. 什么是心跳线?心跳线,主要用于主从服务器之间,是连接工作机与备份机的网线
  8. po 价格条件表_海纳易拓图文讲解SAP MM模块采购价格条件
  9. 哎呦,我他妈真操了!
  10. mysql 使用中_phpmyadmin显示MySQL数据表“使用中” 修复后依然无效的解决方法
  11. 2022年技术胖私藏工具分享
  12. 编译原理04-自顶向下语法分析方法
  13. Steam Deck 游戏掌机可运行 Windows
  14. ultravnc 反向连接_C程序以反向显示链接列表
  15. TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念
  16. Sketch for UX Design Sketch UX设计教程 Lynda课程中文字幕
  17. 【第八届蓝桥杯第七题日期问题】
  18. 一元风暴时买的域名,拿出来晒晒
  19. 左右手坐标系和相关定则的总结
  20. springboot集成spring-boot-starter-data-elasticsearch

热门文章

  1. linux socket pair
  2. Waka Waka (南非时刻)
  3. 黑客入侵 - 认识黑客入侵的利器 嗅探软件 黑客入侵 - 黑客入侵网络的五十种方法
  4. mysql存储过参数拼接_mysql 存储过程动态拼接sql并执行赋值
  5. 关于 OGRE 与 OSG 的简略比较(转自www.MyException.Cn )
  6. 一个简单的用表单标签做的html学生入校注册页面
  7. api.weixin.qq.com: 未知的名称或服务
  8. amw视频转换器_AMW的完整形式是什么?
  9. Google Chrome浏览器使用技巧
  10. python字符串的拼接名字的组成_Python拼接字符串的7种方法