MySQL--查找至少连续出现三次的数字--方法总结

第一步:创建表

mysql> Create table if Not Exists Logs (id int, num int);
Query OK, 0 rows affected (0.24 sec)

mysql> insert into Logs (id, num) values ('1', '1');
Query OK, 1 row affected (0.02 sec)

mysql> insert into Logs (id, num) values ('2', '1');
Query OK, 1 row affected (0.01 sec)

mysql> insert into Logs (id, num) values ('3', '1');
Query OK, 1 row affected (0.01 sec)

mysql> insert into Logs (id, num) values ('4', '2');
Query OK, 1 row affected (0.01 sec)

mysql> insert into Logs (id, num) values ('5', '1');
Query OK, 1 row affected (0.01 sec)

mysql> insert into Logs (id, num) values ('6', '2');
Query OK, 1 row affected (0.01 sec)

mysql> insert into Logs (id, num) values ('7', '2');
Query OK, 1 row affected (0.01 sec)


mysql> select * from logs;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    1 |
|    3 |    1 |
|    4 |    2 |
|    5 |    1 |
|    6 |    2 |
|    7 |    2 |
+------+------+
7 rows in set (0.00 sec)

第二步:查找连续出现三次以上的数字

法一:将logs表分别命名为l1、l2、l3----此方法只能解决连续出现少数的问题,出现次数多的(100次以上)解决困难。

mysql> SELECT DISTINCT
    ->     l1.Num AS ConsecutiveNums
    -> 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
    -> ;
+-----------------+
| ConsecutiveNums |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.01 sec)

法二:使用到:row_number() over(partition by Num order by Id)

mysql> 
SELECT 
    DISTINCT Num as ConsecutiveNums 
FROM (
    SELECT
        Num,COUNT(1) as SerialCount 
    FROM
        (SELECT
            Id,Num,
            row_number() over(order by id) -
            row_number() over(partition by Num order by Id) as SerialNumberSubGroup
        FROM 
            logs) as Sub
GROUP BY
    Num,SerialNumberSubGroup 
HAVING 
    COUNT(1) >= 3) as Result;

+-----------------+
| ConsecutiveNums |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.01 sec)

其中:

mysql> 
SELECT
    Id,Num,
    row_number() over(order by id) as '1'
FROM
    logs;

+------+------+---+
| Id   | Num  | 1 |
+------+------+---+
|    1 |    1 | 1 |
|    2 |    1 | 2 |
|    3 |    1 | 3 |
|    4 |    2 | 4 |
|    5 |    1 | 5 |
|    6 |    2 | 6 |
|    7 |    2 | 7 |
+------+------+---+
7 rows in set (0.00 sec)


-----------------------------------------------------------------------------------------
#这些num值一样的分组排序

mysql> 
SELECT
    Id,Num,
    row_number() over(partition by Num order by Id) as '2'
FROM
    logs;


+------+------+---+
| Id   | Num  | 2 |
+------+------+---+
|    1 |    1 | 1 |
|    2 |    1 | 2 |
|    3 |    1 | 3 |
|    5 |    1 | 4 |
|    4 |    2 | 1 |
|    6 |    2 | 2 |
|    7 |    2 | 3 |
+------+------+---+
7 rows in set (0.00 sec)


-----------------------------------------------------------------------------------------


mysql> 
SELECT
    Id,Num,
    row_number() over(order by id) -
    row_number() over(partition by Num order by Id) as SerialNumberSubGroup
FROM
    logs;


+------+------+----------------------+
| Id   | Num  | SerialNumberSubGroup |
+------+------+----------------------+
|    1 |    1 |                    0 |
|    2 |    1 |                    0 |
|    3 |    1 |                    0 |
|    5 |    1 |                    1 |
|    4 |    2 |                    3 |
|    6 |    2 |                    4 |
|    7 |    2 |                    4 |
+------+------+----------------------+
7 rows in set (0.00 sec)



法三:

lead()函数:Lead函数是跟偏移量相关的分析函数

语法:lead(col,n,default) 用于统计窗口内往下第n行值

参数1为列名,即需要查找的字段

参数2为往下第n行(可选,默认为1),即往后查找的num行的数据

参数3为默认值(当往下第n行为null时候,取默认值,如不指定,则为null

over()表示lead()操作的数据都在over()的范围内,里面可以使用以下子句

  • partition by 语句(用于分组)

  • order by 语句()用于排序)

譬如:over(partition by a order by b) 表示以a字段进行分组,再以b字段进行排序,对数据进行查询。

lag()函数

语法:lag(col,n,DEFAULT) 用于统计窗口内往上第n行值

参数1为列名,即需要查找的字段

参数2为往上第n行(可选,默认为1),即往后查找的num行的数据

参数3为默认值(当往上第n行为null时候,取默认值,如不指定,则为null

mysql> 
select 
    distinct num as ConsecutiveNums
from (
    select 
        num,
        lag(num, 1, null) over (order by id) lag_num,
        lead(num, 1, null) over (order by id) lead_num
    from 
        logs) as l
where 
    l.Num = l.lag_num and l.Num = l.lead_num;

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
mysql-connector-java是Java语言操作MySQL数据库的驱动程序。您可以按照以下步骤使用mysql-connector-java: 1. 下载mysql-connector-java jar文件,可以从MySQL官网或Maven仓库中下载。 2. 将mysql-connector-java jar文件添加到Java项目中的classpath中。您可以手动将文件复制到项目的lib目录中,或者使用构建工具(如Maven)自动下载和添加依赖项。 3. 在Java代码中使用如下的代码加载并连接MySQL数据库: ```java import java.sql.*; public class MySQLConnector { public static void main(String[] args) { Connection conn = null; try { // 加载mysql-connector-java驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 建立数据库连接 String dbUrl = "jdbc:mysql://localhost:3306/mydb"; String user = "root"; String password = "mypassword"; conn = DriverManager.getConnection(dbUrl, user, password); // 执行SQL语句 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); // 处理查询结果 while (rs.next()) { System.out.println(rs.getString("mycolumn")); } // 关闭数据库连接 rs.close(); stmt.close(); conn.close(); } catch (SQLException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } } } ``` 在上面的代码中,我们首先通过Class.forName()方法加载mysql-connector-java驱动程序。然后,我们使用DriverManager.getConnection()方法建立与MySQL数据库的连接。接下来,我们创建一个Statement对象并使用它执行查询。最后,我们处理查询结果并关闭数据库连接。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值