我有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