我有postgresql数据集,如下所示app_id可能有多条记录。我需要选择bool_flag为true的每个app_id的所有记录,如果app_id没有bool_flag值等于true的记录,则选择该应用程序的所有具有false值的记录。
以下是可用数据集的链接 data-set
这是我想要的预期输出,在此先感谢。 desired output
答案 0 :(得分: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
);
如描述所述,它首先使所有行都为“true”。然后它获得“假”行,其中没有对应的“真实”行。
答案 1 :(得分: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