我有postgresql數據集,如下所示,其中app_id可能有多個記錄。我需要爲每個app_id選擇所有記錄,其中bool_flag爲true,並且如果app_id沒有記錄,並且bool_flag值等於true,則爲該應用選擇所有具有false值的記錄。Postgresql根據字段值選擇特定的一組記錄
這裏是鏈接到現有的數據集 data-set
,這是需要的輸出,我提前找,謝謝。 desired output
我有postgresql數據集,如下所示,其中app_id可能有多個記錄。我需要爲每個app_id選擇所有記錄,其中bool_flag爲true,並且如果app_id沒有記錄,並且bool_flag值等於true,則爲該應用選擇所有具有false值的記錄。Postgresql根據字段值選擇特定的一組記錄
這裏是鏈接到現有的數據集 data-set
,這是需要的輸出,我提前找,謝謝。 desired output
這裏有一個方法:
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
);
正如描述的狀態,它開始通過獲取與「真」的所有行。然後在沒有相應的「真」行的情況下獲取「假」行。
謝謝@戈登,我試過你的建議解決方案,它可能是由於我有限的知識,它沒有工作。無論如何感謝您的回覆。用計數窗口功能(第一評論)我得到了我正在尋找的東西。 –
@ZindaHu。 。 。你有錯誤嗎?這是不是工作? –
與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
感謝@vkp,您的第一個方法按預期工作。我得到了我期待的結果。謝謝!! –
這是一個社區,我們可以幫助您編程,但這不是我們爲您編寫代碼的地方。請看看這個指南寫一個很好的SO問題:https://codeblog.jonskeet.uk/2012/11/24/stack-overflow-question-checklist/ – Graham