查询以获取记录具有some_id和some_flag,以便在oracle中所有相同的some_id必须具有所有some_flag ='Y'

问题描述

我是sql的初学者,并尝试编写查询,但未获得所需的结果

select r1.some_id,count(r1.some_id) as ca   from (select r.some_id,r.some_flag,count(r.some_id),count(r.some_flag)
          from table1 r
         group by r.some_id,r.some_flag) r1  group by r1.some_id

我的要求是:对于表中存在的所有some_id,其some_flag为'Y',如果一个为Y,另一个为N,则不应进入some_id。

实际数据如下:

actual data

并希望得到如下结果:

result

解决方法

通过结合使用MIN和分析函数,可以避免两次查询表。

SELECT id,some_id,some_flag
  FROM (SELECT t.*,MIN (some_flag) OVER (PARTITION BY some_id) AS should_return
          FROM table1 t)
 WHERE should_return = 'Y'
,

这里是一个选择:每个some_id的MIN标志必须等于MAX标志,并且必须为Y

select * 
from table1 a
where a.some_id in (select b.some_id
                    from table1 b
                    group by b.some_id
                    having min(b.some_flag) = max(b.some_flag)
                       and min(b.some_flag) = 'Y'
                   )
,

这里是为您提供结果的一种选择。

select *
  from table1 r
where r.some_flag='Y'
  and not exists (select 1
                    from table1 r2
                   where r.some_id=r2.some_id
                     and r2.some_flag <> 'Y')