2012-02-07 10 views
5

各サブシーケンスごとに行数を取得しようとしています。順次レコード数の選択

初期テーブルは次のようになります。

+----+-------------+ 
| id | value  | 
+----+-------------+ 
| 1 | a   | 
| 2 | b   | 
| 3 | b   | 
| 4 | c   | 
| 5 | a   | 
| 6 | a   | 
| 7 | a   | 
| 8 | a   | 
| 9 | c   | 
| 10| c   | 
+----+-------------+ 

クエリは、値の各シーケンスの項目の数を返す必要があります:

+----+-------------+ 
| value | count | 
+----+-------------+ 
| a | 1  | 
| b | 2  | 
| c | 1  | 
| a | 4  | 
| c | 2  | 
+-------+----------+ 

これまでのところ私は来ることができていません大規模なテーブルの場合は、少なくとも十分な速さでは解決できません。理想的には、レコードの順序を混乱させない「グループ・バイ・ステートメント」が存在します。

+2

これは、ランレングス符号化と呼ばれます。 –

+0

http://stackoverflow.com/questions/9172006/how-to-combine-near-same-item-by-sqlの重複 – flesk

答えて

2
SELECT value, count(*) FROM (
    SELECT value, 
    (CASE WHEN @v != value THEN @i:[email protected]+1 ELSE @i END) gid, 
    @v := value FROM myTable, (SELECT @v:='', @i := 0) vars 
) tbl 
GROUP BY gid 
+0

これは非常に近いと思います...唯一のことです。最初のレコードの後のすべてのレコードからの変更で、@ iは次のサイクルを開始するカウントになります。 ELSEをELSE @i:= 1に変更します。ちょうど入ってくる新しいIDの開始点として1にリセットされていることを示します。 – DRapp

+0

@DRapp:試しましたか?私はそれがOPが望んでいるようにうまくいくと思うし、あなたの提案がそれを打破するだろうと思う。常に増加するカウンタが必要です。または、同じ値を異なる値のグループで区切ってグループ化します。 – flesk

+0

あなたは間違っています...それを逃しました。あなたのカウントは実際のカウンターです。ここであなたの "私"の値は、値の間の各周期的な変化の間の強制ブレークです...あなたの "i"変数を誤って解釈しました – DRapp

関連する問題