2016-09-27 6 views
0

デモのために、Redshiftに大きいテーブル(10億行+)があり、2つのフィールド、 idおよびwinという2つのフィールドがあるとします。 winは、0または1とすることができます。Redshift/Postgresqlでパターンが一致するインスタンスの数をカウントする方法

以下のタイプの勝ち順が一致する回数をカウントする効率的な方法がありますか:1000?言い換えれば、テーブルは、このデータが含まれている場合:

+-----+-----+ 
| id | win | 
+-----+-----+ 
| 0 | 0 | 
| 1 | 1 | 
| 2 | 0 | 
| 3 | 1 | 
| 4 | 0 | 
| 5 | 0 | 
| 6 | 0 | 
| 7 | 1 | 
+-----+-----+ 

クエリが、私はこの質問をPostgreSQLので、おそらくSQLに答えることができると思います。1.

を返します。
ありがとうございます。

+0

あなたはwin = 1でid = 3を意味し、id = 4,5,6のすべてがwin = 0で続いていますか? – jarlh

+0

idが空白の場合はどうなりますか? – jarlh

+0

ええ、idギャップは無視する必要があります。 –

答えて

0

一つの方法は、lag()またはlead()を使用しています。

select t.* 
from (select t.*, 
      lead(win, 1) over (order by id) as win_1, 
      lead(win, 2) over (order by id) as win_2, 
      lead(win, 3) over (order by id) as win_3 
     from t 
    ) t 
where win = 1 and win_1 = 0 and win_2 = 0 and win_3 = 0; 

私はPostgresが効果的(id, win)にインデックスを使用すると思います。しかし、数十億行の場合、これは高速ではありません。

+0

私はこれのパフォーマンスについて疑問に思っています...ストリークの長さでエントリーの数を爆破するように見えます。とにかくありがとう。私はRedshiftで試してみるつもりです。 –

+0

Redshiftクラスタ上のすべてのディスクスペースを管理するために管理され、クエリが爆発しました:) –

+0

@ KristianD'Amato。 。 。うわー! Postgresをインデックスに使用したほうがはるかに小さなマシンで動作するでしょう。 –

関連する問題