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
(
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】...相关推荐
- mysql最近7天销售额_mysql查询近七天、近三十天、近年(按月份)的所有统计数据...
目录 在做统计表的时候,需要用mysql查询近7天的数据,当某一天数据为0的时候也需要返回 主要用到: infull函数 union interval函数 date_sub函数infull函数:inf ...
- php mysql复杂查询_PHP MySQL如何做更复杂的查询
我有一个模块,我已经创建了使用PHP,jQuery和MySQL来搜索并返回结果. 我在数据库中有两个表格,我试图从项目和客户端拉取.在项目表中保存一个Client_ID. 现在我试图检索clientN ...
- Oracle/MySQL数据库的表间关联查询_多表关联查询的SQL语句详解
文章目录 内连接 inner join 示例 外连接 outer join left outer join 左外连接 示例 right outer join 右外连接 示例 full outer jo ...
- mysql哪些xss要转译查询_转义字符的妙用不用引号的字符注入和XSS脚本安全 -电脑资料...
声明:本文纯属YY,如有扯淡之处,请告诉小菜俺 THX 在字符型填字游戏中,'和"往往是决定能否跳出约束进行攻击的关键,于是出现鸟转义字符 \ ,可以把' "变成残废....这恰恰帮助我们改变了字符内 ...
- 分解连续自然数的和_【编程练习】正整数分解为几个连续自然数之和
题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...
- python mysql 分页_利用python对mysql表做全局模糊搜索并分页实例
在写django项目的时候,有的数据没有使用模型管理(数据表是动态添加的),所以要直接使用mysql.前端请求数据的时候可能会指定这几个参数:要请求的页号,页大小,以及检索条件. "&quo ...
- mysql union查询_一本彻底搞懂MySQL索引优化EXPLAIN百科全书
MySQL逻辑架构介绍 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...
- mysql 关联查询_响应时间长?MySQL查询优化教程来了!
- 点击上方"爱数据学习社"关注我们吧! - 为什么查询会慢?--响应时间过长. 如果把查询看做是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询, ...
- mysql超长sql查询_超长SQL怎么查询?MySQL列长度限制有哪些 | 学步园
MySQL字符串的限制长度看似重要性不要,其实和整个MySQL数据库的安全性是息息相关的,很值得我们去深入研究分析.SQL注入攻击一直都在被广泛的讨论,然而人们却忽略了今天我将要介绍的这两个安全隐患, ...
最新文章
- Thecus色卡司1U机架式网络存储服务器
- 1.java注释的类型_HappyBKs教你写Java注解(1)——注解的分类、运行机制、作用域及概念汇总...
- 超经典动态规划题:最大子序和
- 【实施工程师之家】——mysql四种索引PRIMARY(主键索引)、INDEX(一般索引)、UNIQUE(非空索引)、FULLTEXT(全文索引)应用
- 二维数组foreach嵌套遍历,判断连续3天以上的算有效数据
- mysql proxy 主从_【MYSQL知识必知必会】MySQL主从复制读写分离(基于mysql-proxy实现)...
- 什么是心跳线?心跳线,主要用于主从服务器之间,是连接工作机与备份机的网线
- po 价格条件表_海纳易拓图文讲解SAP MM模块采购价格条件
- 哎呦,我他妈真操了!
- mysql 使用中_phpmyadmin显示MySQL数据表“使用中” 修复后依然无效的解决方法
- 2022年技术胖私藏工具分享
- 编译原理04-自顶向下语法分析方法
- Steam Deck 游戏掌机可运行 Windows
- ultravnc 反向连接_C程序以反向显示链接列表
- TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念
- Sketch for UX Design Sketch UX设计教程 Lynda课程中文字幕
- 【第八届蓝桥杯第七题日期问题】
- 一元风暴时买的域名,拿出来晒晒
- 左右手坐标系和相关定则的总结
- springboot集成spring-boot-starter-data-elasticsearch
热门文章
- linux socket pair
- Waka Waka (南非时刻)
- 黑客入侵 - 认识黑客入侵的利器 嗅探软件 黑客入侵 - 黑客入侵网络的五十种方法
- mysql存储过参数拼接_mysql 存储过程动态拼接sql并执行赋值
- 关于 OGRE 与 OSG 的简略比较(转自www.MyException.Cn )
- 一个简单的用表单标签做的html学生入校注册页面
- api.weixin.qq.com: 未知的名称或服务
- amw视频转换器_AMW的完整形式是什么?
- Google Chrome浏览器使用技巧
- python字符串的拼接名字的组成_Python拼接字符串的7种方法