2017-06-14 12 views
0

私はapp_idが複数のレコードを持つ可能性のある以下のようなpostgresqlデータセットを持っています。 bool_flagがtrueの各app_idのすべてのレコードを選択する必要があり、app_idにbool_flagの値がtrueのレコードがない場合は、そのアプリケーションのfalse値を持つすべてのレコードを選択します。ここでフィールド値に基づいて特定のレコードセットを選択するPostgresql

は、利用可能なデータへのリンクが data-set

を設定し、これは私が事前のおかげで、探しています所望の出力です。それが「真」ですべての行を取得することにより開始し、記述の状態として

select t.* 
from t 
where t.bool_flag 
union all 
select t.* 
from t 
where not t.bool_flag and 
     not exists (select 1 
        from t t2 
        where t2.app_id = t.app_id and t2.bool_flag 
       ); 

desired output

+1

これはプログラミングに役立つコミュニティですが、私たちがコードを書く場所ではありません。この本をよくお読みください。質問:https://codeblog.jonskeet.uk/2012/11/24/stack-overflow-question-checklist/ – Graham

答えて

0

は、ここに1つの方法です。次に、対応する「真の」行がない「偽の」行を取得します。

+0

ありがとう@Gordon、私はあなたの提案した解決策を試しました。私の限られた知識に起因するかもしれない、それはうまくいかなかった。とにかくお返事いただきありがとうございます。カウントウィンドウ機能(最初のコメント)で私は私が探していたものを得た。 –

+0

@ ZindaHu。 。 。間違いはありますか?これはどのように機能しませんか? –

0

窓関数はcountと同じ方法で行います。

select app_id,created_date,bool_flag 
from (select t.* 
     ,count(case when not bool_flag then 1 end) over(partition by app_id) as false_cnt 
     ,count(*) over(partition by app_id) as total 
     from tbl t 
    ) t 
where bool_flag or total=false_cnt 

もう1つの方法はbool_orです。

select t1.* 
from (select app_id,bool_or(bool_flag) as bool_res 
     from tbl 
     group by app_id 
    ) t 
join tbl t1 on t.app_id=t1.app_id 
where t.bool_res=t1.bool_flag 
+0

ありがとう@vkp、あなたの最初のメソッドは期待どおりに動作しました。私が探していた結果が得られました。ありがとう!! –

関連する問題