对相似的连续记录进行分组,使它们不被其他不同的记录分隔开来-Mysql
在MySQL中,如何对相似的连续记录进行分组,使它们不被其他不同的记录分隔开对相似的连续记录进行分组,使它们不被其他不同的记录分隔开来-Mysql,mysql,Mysql,在MySQL中,如何对相似的连续记录进行分组,使它们不被其他不同的记录分隔开 id | type | 1 | 1 | 2 | 1 | 3 | 1 | 4 | 5 | 5 | 1 | 6 | 8 | 7 | 1 | 8 | 3 | 9 | 3 | 10 | 3 | 结果应该是这样的: id | type | 3 | 1 | 4 | 5 | 5 | 1 | 6 | 8 | 8 | 1
id | type |
1 | 1 |
2 | 1 |
3 | 1 |
4 | 5 |
5 | 1 |
6 | 8 |
7 | 1 |
8 | 3 |
9 | 3 |
10 | 3 |
结果应该是这样的:
id | type |
3 | 1 |
4 | 5 |
5 | 1 |
6 | 8 |
8 | 1 |
10 | 3 |
您只需要一个标准组:
select count(*) id, type, `group`
from mytable
group by type, `group`
请注意,您需要对保留字“group”进行分隔。您的问题的格式相当不正确。我认为以下内容可能与您想要的内容非常接近。它通过分配一个新的
grp
列来标识连续组,从而基于连续的类型
值来标识组
select type, max(id) as maxid, count(*) as numingroup
from (select t.*,
(@grp := if(@type = type, @grp, if(@type := type, @grp + 1, @grp + 1))) as grp
from my_table t cross join
(select @grp := 0, @type := -1)x
order by id
) t
group by grp, type;
不清楚你所说的“相似的、最近的、仅最近的行”是什么意思。你的问题是什么?时间戳与第一个问题无关。最近,表示下一行和上一行相似。如果它们被其他不同的行分开,不要分组。结果应该是4,5,5,对吗?结果应该是!3,4,5,6,8
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,type INT NOT NULL
,x INT NOT NULL
);
INSERT INTO my_table VALUES
(1,1,1),
(2,1,1),
(3,1,1),
(4,5,5),
(5,1,1),
(6,8,8),
(7,1,1),
(8,1,1);
SELECT MIN(c.id) id
, a.type
, a.x
FROM my_table a
LEFT
JOIN my_table b
ON b.id + 1 = a.id
AND b.type = a.type
AND b.x = a.x
LEFT
JOIN my_table c
ON c.id >= a.id
AND c.type = a.type
AND c.x = a.x
LEFT
JOIN my_table d
ON d.id - 1 = c.id
AND d.type = a.type
AND d.x = a.x
WHERE b.id IS NULL
AND c.id IS NOT NULL
AND d.id IS NULL
GROUP
BY a.id;
+------+------+---+
| id | type | x |
+------+------+---+
| 3 | 1 | 1 |
| 4 | 5 | 5 |
| 5 | 1 | 1 |
| 6 | 8 | 8 |
| 8 | 1 | 1 |
+------+------+---+