consecutive numbers 180

本博客介绍了一个SQL查询方法,用于找出Logs表中连续出现三次及以上的数字。通过利用MySQL用户定义变量和聚合函数,实现了对连续数字的统计和筛选。

[LeetCode]Consecutive Numbers 
转账作者‘在线疯狂’,非常感谢‘在线疯狂‘给出的解析。很赞很给力!

题目描述:

Write a SQL query to find all numbers that appear at least three times consecutively.

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+

For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times.

题目大意:

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

例如,给定上面的Logs表,1是唯一至少连续出现3次的数字。

解题思路:

可以从题目Rank Scores(http://oj.leetcode.com/problems/rank-scores/)中获得启示

配合使用MySQL用户定义变量和聚组函数统计连续出现的数字个数

SQL语句:

# Write your MySQL query statement below
SELECT DISTINCT Num FROM (
  SELECT Num, COUNT(Rank) AS Cnt FROM (
    SELECT    Num,
              @curRank := @curRank + IF(@prevNum = Num, 0, 1) AS rank, @prevNum := Num
    FROM      Logs s, (SELECT @curRank := 0) r, (SELECT @prevNum := NULL) p
    ORDER BY  ID ASC
  ) t GROUP BY Rank HAVING Cnt >= 3 
) n;

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

对’@curRank := @curRank + IF(@prevNum = Num, 0, 1) AS rank, @prevNum := Num‘ 的说明,@prevNum = Num, 0, 1 是否prevNum 是否与Num相等,如果相等二者则为0,否则另prevNum为1.

补充说明:

以题目描述的Logs表为例,上面的SQL语句中,最内层的SELECT语句执行结果如下:

+-----+------+-----------------+
| Num | rank | @prevNum := Num |
+-----+------+-----------------+
|  1  |   1  |        1        |
|  1  |   1  |        1        |
|  1  |   1  |        1        |
|  2  |   2  |        2        |
|  1  |   3  |        1        |
|  2  |   4  |        2        |
|  2  |   4  |        2        |
+-----+------+-----------------+

执行结果中的rank列将Num转化为从1开始递增的序号,但序号只在Num出现变化时增加,(连续出现的相同数字序号也相同)

第二层SELECT语句对rank进行计数,并只保留计数不小于3的条目,执行结果为:

+-----+-----+
| Num | Cnt |
+-----+-----+
|  1  |  3  |
+-----+-----+

最外层SELECT语句对Num进行去重。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值