Mysql实战之求出连续范围

1.需求

根据表中的某一字段,求出其字段变化的连续范围。下面给出一个示例。
首先看表x,其中包含数据

mysql> select * from x;
+------+
| a    |
+------+
|    3 |
|    4 |
|    5 |
|    6 |
|  100 |
|  101 |
|  102 |
|  105 |
|  106 |
|  107 |
+------+
10 rows in set (0.03 sec)

那么对于这个表x字段a的连续范围就是3-6;100-102;105-107。现在需要求出这个范围。下面的代码就会介绍这个实现。

2.代码

select
min(a) as start_date
,max(a) as end_date
from
(
	select 
	a
	,@rank := @rank+1 
	,a - @rank as gro
	from 
	(
		select 
		a,
		@rank := 0
		from x
	)as t1
)as t2
group by gro;

3.实现结果如下:

+------------+----------+
| start_date | end_date |
+------------+----------+
|          3 |        6 |
|        100 |      102 |
|        105 |      107 |
+------------+----------+
3 rows in set (0.00 sec)

4.难点简介

  • @rank这是mysql中定义一个变量的语法,@rank := 0是给rank这个变量赋值的语法
  • 通过一个构造变量的方法来实现递增排序。并通过value - rank来分组得到递增的序列。
  • 若有不明之处,欢迎留言咨询~