2017-06-13 5 views
1

state = 'error'を持つすべてのレコードを取得するために、次のクエリを使用して、状態が別のものになるまでbased on this questionとします。あなたがbool_and(state='error')条件を無視して、偽として扱われているすべての状態の下に見ることができるように文字列をブール値または整数の中のbool_andの中のPostgresで変換する

現在のクエリは、しかし、この

SELECT * from (select id, subscription_id, state, created_at, 
    bool_and(state='error') OVER (order by created_at, id) AS ok 
    FROM messages ORDER by created_at) m2 
    WHERE subscription_id = 1; 

のように見えます。

id | subscription_id | state |   created_at   | ok 
---------+-----------------+-------+----------------------------+---- 
    69480 |    1 | error | 2015-06-30 15:20:03.041045 | f 
    69482 |    1 | error | 2015-06-30 15:20:04.582907 | f 
    69492 |    1 | sent | 2015-06-30 22:50:04.50478 | f 
    69494 |    1 | error | 2015-06-30 22:50:06.067279 | f 
    69502 |    1 | error | 2015-07-01 22:50:02.356113 | f 

私は状態は他の何かを持っている場合、すべてのok行がtときstate = 'error'fを返すことを期待します。

私は、bool_andだけがブール値と整数を取りますが、条件の結果がブール値であると想定されているかどうかはわかりません。

なぜこれが機能しないのか、どのように動作するのか、

+2

あなたはbool_and' 'のパーティションの集約いけない - ので、あなたは一つの状態=送っがありbool_and(状態=「エラー」)が偽であることを意味します全体的に - そうですか? 'over(' –

+0

Perfect!ありがとうございました。 – Martin

+0

確かに、心配はありません –

答えて

2

あなたがbool_andの集計を分割していないので、それはすべての行をそれを上に集約 - あなたはbool_and(state='error') is false全体的な

試し追加partition by state更新

一部over(から より良いが

を変更することを意味1 state=sentを持っています
bool_and(state='error') OVER (order by created_at, id) AS ok 

~

bool_and(state='error') OVER (partition by state) AS ok 
+0

クエリの最後に 'AND ok = true'を追加すると、' state = sent'を見つけた後に停止していないようですが、4つの 'state = 'error''記録。 – Martin

+0

正確な期待リターン、データサンプル、テーブル構造でポストを更新できますか?だから私は問題をデバッグすることができましたか?... –

+0

私はこれが新しい質問としてより良く策定されたと信じています。こちらをご覧ください:https://stackoverflow.com/questions/44519961/select-until-row-matches-in-postgres – Martin

2

試してみてください。それはすべての行をそれを上に集約するよう

SELECT * 
FROM (
     SELECT  id 
       , subscription_id 
       , state 
       , created_at 
       , bool_and(state = 'error') 
       OVER (PARTITION BY state ORDER BY created_at, id) AS ok 
     FROM  messages 
     ORDER BY created_at 
    ) AS m2 
WHERE subscription_id= 1; 
関連する問題