これを行う最も簡単な方法は、ループを使用する方法です。 レコードを反復処理するストアドプロシージャを記述することも、データベース外で実行することもできます。これを一度やる必要があるなら、私はそれを好きにします。これが連続的なプロセスである場合は、余分なデータが最初にデータベースに挿入されないようにすることをお勧めします。ここでは何が起こる
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
列と
- すべてのレコードのリスト、。
- 削除する必要があるGroupNumのリスト。
この時点でレコードを削除するのは簡単です。
どのように「最初」を保証していますか?行は順序付けされません。 – colithium
連続する10個(1つ後に1つ)の行、または11番目の行(+)のブロックで繰り返しますか? –