首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql --如何将列的值分组为max范围?

Mysql --如何将列的值分组为max范围?
EN

Stack Overflow用户
提问于 2015-06-12 10:20:52
回答 2查看 239关注 0票数 3

我能否将另一列的值分组为多个范围定义?

下面是一个示例表:

代码语言:javascript
复制
mysql> select * from t;
+------+------+
| x    | y    |
+------+------+
|    1 |    1 |
|    2 |    1 |
|    3 |    1 |
|    4 |    2 |
|    5 |    2 |
|    6 |    2 |
|    7 |    1 |
|    8 |    1 |
|    9 |    1 |
+------+------+

我想选择以下信息:y=1有x:1-3, 7-9的范围,y=2有范围:4-6

定义和数据:

代码语言:javascript
复制
create table t (x int, y int);
insert into t(x,y) values (1,1),(2,1),(3,1),(4,2),(5,2),(6,2),(7,1),(8,1),(9,1);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-12 10:55:29

如果x是一个连续序列(没有间隙),那么您可以这样做:

代码语言:javascript
复制
SELECT a.y
     , a start
     , MIN(c.x) end 
  FROM t a
  LEFT 
  JOIN t b 
    ON b.y = x.y
   AND b.x = a.x - 1
  LEFT 
  JOIN tbl c 
    ON c.y = a.y
   AND c.x >= a.x
  LEFT 
  JOIN t d 
    ON d.y = a.y
   AND d.x = c.x + 1
 WHERE b.x IS NULL 
   AND c.x IS NOT NULL
   AND d.x IS NULL
 GROUP 
    BY a.y,a.x; 

http://www.sqlfiddle.com/#!9/26aef/33

如果不是这样的话,你可以这样做:

代码语言:javascript
复制
SELECT a.y
     , a.x start
     , MIN(c.x) end 
  FROM (SELECT *,@a:=@a+1 rank FROM t,(SELECT @a:=0) vars ORDER BY x) a
  LEFT 
  JOIN (SELECT *,@b:=@b+1 rank FROM t,(SELECT @b:=0) vars ORDER BY x) b 
    ON b.y = a.y
   AND b.rank = a.rank - 1
  LEFT 
  JOIN (SELECT *,@c:=@c+1 rank FROM t,(SELECT @c:=0) vars ORDER BY x) c 
    ON c.y = a.y
   AND c.rank >= a.rank
  LEFT 
  JOIN (SELECT *,@d:=@d+1 rank FROM t,(SELECT @d:=0) vars ORDER BY x) d 
    ON d.y = a.y
   AND d.rank = c.rank + 1
 WHERE b.x IS NULL 
   AND c.x IS NOT NULL
   AND d.x IS NULL
 GROUP 
    BY a.y,a.x; 

http://www.sqlfiddle.com/#!9/26aef/54

但是,对于较大的数据集,这两个查询都会比较慢。尽管如此,第二种解决方案中包含的一个想法可以适用于性能有问题的情况--嗯,类似于汽车10的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2015-06-12 10:53:32

试试这个:

代码语言:javascript
复制
SELECT y,group_concat(xr) FROM (
 SELECT y,
  CASE WHEN min(x)=max(x) THEN CAST(min(x) as char(8))
       ELSE concat(CAST(min(x) AS char(8)),'-',CAST(max(x) AS char(8)))
  END xr, g FROM (
  SELECT y,x, CASE WHEN @g=@c AND x=@l+1
                   THEN @g ELSE @c:=@g:=@g+1 END g ,
         @l:=x  lastx 
  FROM tab,( SELECT @g:=0, @c:=-1, @l=-1 ) vars
  ORDER BY y,x
 ) grp1
 GROUP BY y,g
) grp2 GROUP BY y

使用的变量:

代码语言:javascript
复制
@g  group counter
@c  current x value
@l  previous ('last') x value

我还修正了每个组的单项问题。

请看这里的工作小提琴:http://www.sqlfiddle.com/#!9/cc836/2

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30800666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档