MySQL之LeetCode-180(连续出现的数字)

16 篇文章 0 订阅
16 篇文章 0 订阅

题目(中等)

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

±—±----+
| Id | Num |
±—±----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
±—±----+
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

±----------------+
| ConsecutiveNums |
±----------------+
| 1 |
±----------------+

解题语句

刚开始没有审清题,以为是至少出现三次,写下了下面的语句:

SELECT
  t.num AS ConsecutiveNums
FROM
  (SELECT
    l.num,
    SUM(
      CASE
        WHEN l.num = n.num
        THEN 1
      END) AS cou
  FROM
    LOGS AS l,
    (SELECT DISTINCT
      num
    FROM
      LOGS) AS n
  GROUP BY l.num) AS t
WHERE t.cou >= 3

解法一:连续出现三次就自连接三次

SELECT DISTINCT
    l.Num AS 'ConsecutiveNums'
  FROM
    LOGS l,
    LOGS l1,
    LOGS l2
  WHERE l.Id = l1.Id - 1
    AND l.Id = l2.Id - 2
    AND l.Num = l1.Num
    AND l.Num = l2.Num

这种解法需要id是连续的,而且不易扩展,如果要求变成连续出现N次,就需要自连接N次。

解法二:在查询语句中使用变量

SELECT DISTINCT
      Num AS ConsecutiveNums
    FROM
      (SELECT
        Num,
        @count := (@count * (@prev = (@prev := Num)) + 1) COUNT
      FROM
        LOGS,
        (SELECT
          @count := 0,
          @prev := - 1) b) a
    WHERE a.count > 2

如果不明白先执行:

SELECT
        Num,
        @count := (@count * (@prev = (@prev := Num)) + 1) COUNT
      FROM
        LOGS,
        (SELECT
          @count := 0,
          @prev := - 1) b

得到结果:

输入
{“headers”: {“Logs”: [“Id”, “Num”]}, “rows”: {“Logs”: [[1, 1], [2, 1], [3, 1], [4, 2], [5, 1], [6, 2], [7, 2]]}}
输出
{“headers”:[“Num”,“COUNT”],“values”:[[1,1.0],[1,2.0],[1,3.0],[2,1.0],[1,1.0],[2,1.0],[2,2.0]]}
预期结果
{“headers”:[“ConsecutiveNums”],“values”:[[1]]}
看到这个结果应该就明白这个解法的思路了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值