2017-06-14 104 views
0

我有postgresql數據集,如下所示,其中app_id可能有多個記錄。我需要爲每個app_id選擇所有記錄,其中bool_flag爲true,並且如果app_id沒有記錄,並且bool_flag值等於true,則爲該應用選擇所有具有false值的記錄。Postgresql根據字段值選擇特定的一組記錄

這裏是鏈接到現有的數據集 data-set

,這是需要的輸出,我提前找,謝謝。 desired output

+1

這是一個社區,我們可以幫助您編程,但這不是我們爲您編寫代碼的地方。請看看這個指南寫一個很好的SO問題:https://codeblog.jonskeet.uk/2012/11/24/stack-overflow-question-checklist/ – Graham

回答

0

這裏有一個方法:

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 
       ); 

正如描述的狀態,它開始通過獲取與「真」的所有行。然後在沒有相應的「真」行的情況下獲取「假」行。

+0

謝謝@戈登,我試過你的建議解決方案,它可能是由於我有限的知識,它沒有工作。無論如何感謝您的回覆。用計數窗口功能(第一評論)我得到了我正在尋找的東西。 –

+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 

另一種方式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,您的第一個方法按預期工作。我得到了我期待的結果。謝謝!! –

相關問題