问题描述
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。
实际数据如下:
并希望得到如下结果:
解决方法
通过结合使用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')