在SQL中,在INT范围内分组

问题描述 投票:-1回答:1

我有以下sql表;

我需要按intx值对行进行分组,但是这个intx值是动态的,所以没有特定的值范围。

id, intx,   name
"1" "70"    "x7"
"2" "99"    "x100"
"3" "100"   "x100"
"4" "101"   "x100"
"5" "69"    "x7"
"6" "50"    "x5"

我想使用intx对此表进行分组。

但是,我想在(intx + 1)和(intx-1)之间对intx的值进行分组

例如; intx值= 100,101和99必须是一组。

使用以下命令;

select  a.intx, b.intx,a.name,b.name,MAX(a.intx,b.intx),MIN(a.intx,b.intx)
from t1 a inner join t1 b
on a.intx  <=b.intx+1 and a.intx >= b.intx-1 and a.intx<>b.intx
group by  MAX(a.intx,b.intx)

但是给我以下结果; a.intx,b.intx,a.name,b.name,MAX,MIN

a.intx  b.intx  a.name  b.name  MAX     MIN
"69"    "70"    "x7"    "x7"    "70"    "69"
"100"   "99"    "x100"  "x100"  "100"   "99"
"101"   "100"   "x100"  "x100"  "101"   "100"

没有将101放入第二组。

mysql sql group-by
1个回答
0
投票

我不禁感到这个问题遗漏了一些东西,所以试图澄清如果你将规则应用于所提供的数据会发生什么。

drop table if exists t;
create table t (id int, intx int,   name varchar(10));
insert into t values
(1, 70  ,  'x7'),
(2, 99  ,  'x100'),
(3, 100 ,  'x100'),
(4, 101 ,  'x100'),
(5, 69  ,  'x7'),
(6, 50  ,  'x5');

select t1.intx midintx,t1.name,t3.name,t1.intx as minintx, t3.intx as maxintx from t t1
join  t t2 on t2.intx = t1.intx - 1
join  t t3 on t3.intx = t1.intx + 1;

+---------+------+------+---------+---------+
| midintx | name | name | minintx | maxintx |
+---------+------+------+---------+---------+
|     100 | x100 | x100 |     100 |     101 |
+---------+------+------+---------+---------+
1 row in set (0.00 sec)

请注意,只有x100出现,x7和x5被删除,因为它们没有3个值。

如果98确实出现在x100下那么

drop table if exists t;
create table t (id int, intx int,   name varchar(10));
insert into t values
(1, 70  ,  'x7'),
(2, 99  ,  'x100'),
(3, 100 ,  'x100'),
(4, 101 ,  'x100'),
(5, 69  ,  'x7'),
(6, 50  ,  'x5'),
(7, 98  ,  'x100');

+---------+------+------+---------+---------+
| midintx | name | name | minintx | maxintx |
+---------+------+------+---------+---------+
|      99 | x100 | x100 |      99 |     100 |
|     100 | x100 | x100 |     100 |     101 |
+---------+------+------+---------+---------+
2 rows in set (0.00 sec)

根据规则看起来正确。请评论。

© www.soinside.com 2019 - 2024. All rights reserved.