mySQL检索按顺序重复一个值的记录

标签 mysql

我有一个包含 300,000 条记录的大表。该表有一个称为“速度”的整数值,它的值是从 0 到 100。 在第一个记录中,值为 0,我想删除。我想从查询中删除速度场重复超过 10 次的记录。例如:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 5 10 12 13 15 20 30 20 15 10 8 5 2 1 0 0 0 0 4 5 10 20...

[--------删除这个------------]....... ...................................................[--- ------] <- 不要删除这个

谢谢

最佳答案

最简单的方法是使用循环。 您可以编写一个循环访问记录的存储过程,或者您可以在数据库外部执行此操作。如果这需要做一次,我会那样做。如果这是一个连续的过程,最好首先确保额外的数据没有插入到数据库中。

无论如何,如果您坚持在纯 SQL 中执行此操作,没有带循环的存储过程,您可以使用这样的查询:

set @groupnum=0;

select 
  GroupNum,
  count(*) as RecsInGroup 
from
(
    select 
      t1.id as Id,
      t1.velocity as velocity1,
      t2.velocity as velocity2,  
      if(t1.velocity<>t2.velocity,@groupnum:=@groupnum+1,@groupnum) as GroupNum
    from 
      VelocityTable as t1
    join
      VelocityTable as t2  
    on
      t1.id=t2.id-1
) as groups
group by
  GroupNum  
having RecsInGroup>10

这里发生了什么?

第一步

内部查询只选择表中的所有记录,但将数据拆分成连续的组。

因此,使用您的示例,它会执行以下操作:

velocity : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 5 10 12 13 15 20 30 20 15 10  8  5  2  1  0  0  0  0  4  5 10 20
Groupnum : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 18 18 18 19 20 21 22

它通过将表连接到自身,通过链接表中的后续记录来做到这一点。每当左右速度不同时,GroupNum 就会增加。否则保持不变。

第二步

如果查询包含在外部查询中,并按 GroupNum 分组,则结果。同样,使用您的示例将导致:

GroupNum,RecsInGroup
0,15 // !!
1,1
2,1
3,1
4,1
5,1
6,1
7,1
8,1
9,1
10,1
11,1
12,1
13,1
14,1
15,1
16,1
17,1
18,4 // !!
19,1
20,1
21,1

通过添加 having RecsInGroup>10 子句,结果变成这样:

GroupNum,RecsInGroup
0,15

现在,使用这个 GroupNum 列表,您可以删除记录。

第 3 步

通过上面的查询你有:

  1. 所有记录的列表,添加了 GroupNum 列。
  2. 需要删除的 GroupNum 的列表。

此时删除记录应该很容易。

关于mySQL检索按顺序重复一个值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1236799/

相关文章:

mysql - pthread导致mysql内存泄漏

MySQL - GROUP BY 并仅显示重复项

phpmyadmin 停留在登录状态(nginx 服务器)

PHP MySQL GROUP_CONCAT 限制

mysql - 在bookshelf.js中设置value = value +1

php - 左连接无法检索随机列

c# Mysql 已经有一个与此 Connection 关联的打开的 DataReader

两个字符串之间的 MySQL 子字符串

PHP MySQL : issue using php for and mysql query

php - MYSQL:对除 0 和 null 之外的所有值进行 GROUP BY?