我有一张有300,000笔记录的大桌子.该表具有一个称为“速率”的整数值,而且它的值是从0到100. 在firsts记录中,该值为0,我要删除.我想从查询中删除速率场一再高出10次的记录.譬喻:
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
这里会产生什么?
第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
通过添加具有RecsInGroup> 10子句,功效变为:
GroupNum,15
此刻,行使此GroupNum列表,您可以删除记录.
第三步
通过上面的查询,您可以:
>全部记录的列表,并添加了GroupNum列. >必要删除的GroupNum的列表.
此时,删除记录应该很轻易.
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|