2009-08-06 15 views
3

私は30万レコードの大きなテーブルを持っています。このテーブルには「速度」という整数値があり、値は0〜100です。 最初のレコードでは、値は0で、削除します。私は、速度フィールドが10回以上繰り返されるレコードをクエリーから削除したい。例:mySQLは、値を繰り返すレコードを取得します

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 4 5 10 20 ...

[-------削除する-----------] ........................ ............................................... [ - -------] < - 私はちょうど同じ値を理解するために伸縮する可変サイズのウィンドウで、順次レコードをリッピングしたいこの

おかげ

+0

どのように「最初」を保証していますか?行は順序付けされません。 – colithium

+0

連続する10個(1つ後に1つ)の行、または11番目の行(+)のブロックで繰り返しますか? –

答えて

0

を削除しないでください。値が変更されたときにサイズが> = 10になる場合は常に、主キーを使用して行を削除します。

DELETE文の始めと最後にBEGIN TRANとCOMMIT TRANを入れて、合理的に効率的にすることができます。

+0

注:操作はレコードの順序に依存するため、実際にはセットベースの問題ではありません。したがって、SQLを使用することは厄介なことになります。あなたの手続き型言語を使って、それを順序付けられたリストとして見るほうが良いでしょう。 – dkretz

3

これを行う最も簡単な方法は、ループを使用する方法です。 レコードを反復処理するストアドプロシージャを記述することも、データベース外で実行することもできます。これを一度やる必要があるなら、私はそれを好きにします。これが連続的なプロセスである場合は、余分なデータが最初にデータベースに挿入されないようにすることをお勧めします。ここでは何が起こる

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:[email protected]+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 

:あなたは、ループでストアドプロシージャせずに、純粋なSQLでこれを行う上で主張すれば

とにかく、あなたはこのようなクエリを使用することができますか?

ステップ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 

さて、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句を追加することで、結果がこれになります。もし上記のクエリでは

ステップ3

いる:追加GroupNum列と

  1. すべてのレコードのリスト、。
  2. 削除する必要があるGroupNumのリスト。

この時点でレコードを削除するのは簡単です。

0

ありがとうございます。私はそこにすべてですが、私はテーブルソースとしてmySQL Viewを試してみましたが、動作していませんでした(未知の表xxx)。 1900万以上のレコードを持っているため、テーブル全体を使用することはできません。特定の日、車両プレート、都市からのレコードが必要です。

関連する問題