我有以下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放入第二组。
我不禁感到这个问题遗漏了一些东西,所以试图澄清如果你将规则应用于所提供的数据会发生什么。
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)
根据规则看起来正确。请评论。