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

时间:2009-08-06 03:13:41

标签: mysql

我有一张包含300,000条记录的大桌子。该表有一个名为“velocity”的整数值,其值为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 ...

[-------删除此-----------] ......................... .............................................. [--- ------]< - 不要删除此

由于

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用循环。 您可以编写一个迭代记录的存储过程,也可以在数据库之外执行。如果需要这样做,我会这样做。如果这是一个连续的过程,最好确保额外的数据首先不插入数据库。

无论如何,如果你坚持在纯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

这里发生了什么?

第1步

内部查询只选择表中的所有记录,但按顺序组拆分数据。

因此,使用您的示例,它会这样做:

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就会增加。否则它保持不变。

第2步

如果查询包装在外部查询中并按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列表。
  3. 此时删除记录应该很容易。

答案 1 :(得分:0)

我只是按顺序翻录记录,使用可变大小的窗口进行扩展和收缩以理解相同的值。每当值改变时大小为> = 10时,使用主键删除行。

您可以在DELETE语句的开头和结尾放置BEGIN TRAN和COMMIT TRAN,以使事情合理有效。

答案 2 :(得分:0)

非常感谢你。我几乎都在那里,但我尝试使用mySQL View作为表源,它不起作用(未知表xxx)。我不能使用整个表,因为它有超过1900万条记录,我只需要特定日期,车辆板块和城市的记录。