Postgresql根据字段值选择特定的记录集

时间:2017-06-14 00:03:49

标签: sql postgresql

我有postgresql数据集,如下所示app_id可能有多条记录。我需要选择bool_flag为true的每个app_id的所有记录,如果app_id没有bool_flag值等于true的记录,则选择该应用程序的所有具有false值的记录。

以下是可用数据集的链接 data-set

这是我想要的预期输出,在此先感谢。 desired output

2 个答案:

答案 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