2017-06-14 116 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,您的第一个方法按预期工作。我得到了我期待的结果。谢谢!! –

相关问题