跪求 分组相同且连续的记录,并取 Min Max 的 SQL 查询的方法

今天在公司做 IP 数据库转换功能,目的是将网上很容易找到的 IP 数据库整理出来,与公司的地区数据库相关联。网上流传得最多的就是 QQ 纯真版的 QQWry.dat 这个数据库。但是它数据库里面地区我们拿来没法用,如:四川省成都市某某某网吧、四川省某某医院、北京某某街某某号 等等,省、市、具体位置是连在一起的,无法找出规律把省、市分离出来(因为我要做的功能只用具到城市就可以了,类似 口碑中华英才网 哪种自动取得访问者所在城市并进入城市的网站的功能)。

后面另外找到了一个 mdb 的数据库忘了哪儿下载的了,总之我把它导出成 文本格式 了,然后用 python 分析字符串,并跟自已的地区数据库做关联,最终再存入数据库。可没想到这玩意儿既然有23 万多条记录,妈呀,这怎么能拿来查找。而且我功能是首页,最起码要求查询速度要在100ms以内。而这 23 万多条,就算我全放内存里面也没法找得哪么快。

结构是这样:

1
2
3
4
5
6
7
8
id       start        end          name        area_id          area_type
1        1            4            Chengdu     8                2
2        5            6            Chengdu     8                2
3        7            16           Luzhou      9                2
4        17           17           Luzhou      9                2
5        18           22           Chengdu     8                2
6        23           23           Shanghai    17               1
7        24           29           Shanghai    17               1

startend 字符串 IP 转成整形的值,1-2、3-4、5、6-7其实是可以分别组合起来的,只用留下最小的 start 最大的 end就可以了。

正确的结果应是:

1
2
3
4
5
id       start        end          name        area_id          area_type
1        1            6            Chengdu     8                2
3        7            17           Luzhou      9                2
5        18           22           Chengdu     8                2
6        23           29           Shanghai    17               1

我开始时候试着用 Group by name 查询再 min(start) max(end) 但最终发现这样做法数据有错,它把 所有成都的记录都组合到了一起。

错误的结果:

1
2
3
4
id       start        end          name        area_id          area_type
1        1            22           Chengdu     8                2
3        7            17           Luzhou      9                2
6        23           29           Shanghai    17               1

 

我想了很久都没想出访怎么写 SQL,最后只好还是用 python 写循环,判断前一行与当前行,再做处理,最终还是弄出来了。不过很想知道有没有好的方法可以直接用 SQL 里面类似 group by 的方式弄出来。