微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决查询以获取记录具有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')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。