码迷,mamicode.com
首页 > 数据库 > 详细

SQL查找连续出现的数字

时间:2019-02-12 21:22:59      阅读:474      评论:0      收藏:0      [点我收藏+]

标签:from   log   编写   HERE   实现   enum   查询   mod   tin   

基于Oracle;

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

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

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

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

解决代码如下:
SELECT DISTINCT num ConsecutiveNums
FROM (
 SELECT num
  ,count(1) rn2
 FROM (
  SELECT Id
   ,Num
   ,row_number() OVER (
    ORDER BY ID
    ) - row_number() OVER (
    PARTITION BY Num ORDER BY Id
    ) rn
  FROM Logs
  )
 GROUP BY num
  ,rn
 )
WHERE rn2 >= 3

题目不难也不复杂,思路比较有趣,故写文解释一下,写代码往往有一些取巧的方式,由于SQL毕竟只是数据库语言,不能跟其他语言比功能性,所以有时需要用一些取巧的方式来达到结果

比如去固定取每周的周几,可以用日期除以7再通过去mod的方式来实现;上面这题中,两个关键点,

1、row_number()over(order by id)这句取顺序序号;

2、row_number()over(partition by num order by id) 这句用来取同个num下的序号;

上面的1跟2相减,由于连续值在该相减过程中差值是一样的,如下图,故可以通过该方法取出连续值

技术图片

 

SQL查找连续出现的数字

标签:from   log   编写   HERE   实现   enum   查询   mod   tin   

原文地址:https://www.cnblogs.com/rango-lhl/p/10366881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!