mysql 取得表中重复值之间的间隔以及最大间隔

今天在论坛上看到一个帖子,我觉得挺有意思,帖子如下:


虽说我现在在mysql方面能力有限,但也想尝试一把,想把它搞出来,经过我的不懈努力,算是有个结果了,可以给自己一个交代了,大笑

鉴于目前的我是个mysql菜鸟,看着回帖子的都是版主,大拿级人物,没敢和人家平起平坐,所以我没把自己的小小成果以帖子的形式回给人家,还是放到自己小窝里供大家和自己分享吧

以下为我做的实验步骤:

[root@pw2 tmp]# mysql -uroot -p123456
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.1.66 Source distribution


Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create table test(id varchar(10));
Query OK, 0 rows affected (0.04 sec)


mysql> insert into test(id) values('a');
Query OK, 1 row affected (0.00 sec)


mysql> insert into test(id) values('b');
Query OK, 1 row affected (0.00 sec)


mysql> insert into test(id) values('c');
Query OK, 1 row affected (0.00 sec)


mysql> insert into test(id) values('a');
Query OK, 1 row affected (0.00 sec)


mysql> insert into test(id) values('d');
Query OK, 1 row affected (0.00 sec)


mysql> insert into test(id) values('e');
Query OK, 1 row affected (0.00 sec)


mysql> insert into test(id) values('f');
Query OK, 1 row affected (0.00 sec)


.
.
.


mysql> insert into test(id) values('o');
Query OK, 1 row affected (0.00 sec)


mysql> insert into test(id) values('a');
Query OK, 1 row affected (0.00 sec)


mysql> select * from test;
+------+
| id   |
+------+
| a    |
| b    |
| c    |
| a    |
| d    |
| e    |
| f    |
| a    |
| g    |
| h    |
| i    |
| a    |
| j    |
| k    |
| l    |
| m    |
| n    |
| o    |
| a    |
+------+
19 rows in set (0.00 sec)


mysql> set @rownum=0;                                   --初始化变量rownum,初始值为0
Query OK, 0 rows affected (0.00 sec)


mysql> set @rownum1=0;                                 --初始化变量rownum1,初始值为0
Query OK, 0 rows affected (0.00 sec)

--查询表中重复记录a的各个间隔
mysql> select c.rownum,c.id,min(c.rownum-d.rownum)-1 from (select b.rownum,b.id from (select @rownum:=@rownum+1 as rownum,id from test) b where b.id='a') c
    -> inner join (select e.rownum,e.id from (select @rownum1:=@rownum1+1 as rownum,id from test) e where e.id='a') d on (c.rownum>d.rownum)
    -> group by c.rownum,c.id;

+--------+------+--------------------------+
| rownum | id   | min(c.rownum-d.rownum)-1 |
+--------+------+--------------------------+
|      4 | a    |                        2 |
|      8 | a    |                        3 |
|     12 | a    |                        3 |
|     19 | a    |                        6 |
+--------+------+--------------------------+
4 rows in set (0.00 sec)

--查询表中重复记录a的最大间隔

mysql> select max(f.z) from (select min(c.rownum-d.rownum)-1  z from (select b.rownum,b.id from (select @rownum:=@rownum+1 as rownum,id from test) b where b.id='a') c
    -> inner join (select e.rownum,e.id from (select @rownum1:=@rownum1+1 as rownum,id from test) e where e.id='a') d on (c.rownum>d.rownum)
    -> group by c.rownum,c.id) f;

+----------+
| max(f.z) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)


mysql> 


解释说明:

要是只是按帖子中说的一个字段,无法取得重复记录之间的间隔,同时也就不能求出最大间隔

所以,需要构造一个虚拟列(rownum),用这列记录表中记录的行号。

设置两个临时变量,初始值设置为0: set @rownum=0;   以及 set @rownum1=0;

让@rownum自加1并赋值给自己作为行号

min(c.rownum-d.rownum)  为的是让相邻两个重复值之间相减

min(c.rownum-d.rownum)-1  取得间隔

max(f.z) 取得最大间隔

语句看起来挺复杂,其实就是做了个自连接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值