表格结构如下:
++ID++++READ_ID++++READ_TYPE
101 201 30
102 201 35
103 201 40
104 201 60
105 202 50
106 202 60
我需要根据以下条件选择READ_TYPE:
条件1:如果存在30,35或40,则检查每个READ_ID。如果存在,则选择30,35和40中存在的最大READ_TYPE。 例如,READ_ID 201有30,35,40和60.结果必须是40。
条件2:如果不存在30,35或40,则获取read_type的最大值。 例如,READ_ID 202有50和60.结果必须是60。
如何通过单个oracle SQL查询实现此目的。
答案 0 :(得分:1)
您可以使用条件聚合执行此操作:
select read_id,
(case when sum(case when read_type in (30, 35, 40) then 1 else 0 end) > 0
then max(case when read_type in (30, 35, 40) then read_type end)
else max(read_type)
end) as themax
from t
group by read_id;
答案 1 :(得分:1)
您可以使用KEEP
子句获得所需内容:
select read_id
, max(read_type) keep (dense_rank last
order by case when read_type not in (30,35,40)
then 1
else 2
end
, read_type) max_read_type
from Your_Table
group by read_id;
答案 2 :(得分:0)
请尝试此查询。我在一个例子上测试了它,它在oracle上工作正常。
select READ_ID, MAX(READ_TYPE) from tab
where READ_TYPE in (30,35,40)
group by READ_ID
union
select READ_ID, MAX(READ_TYPE) from tab t1
where not exists
(select 1 from tab t2 where t2.READ_TYPE in (30,35,40) and t1.READ_ID = t2.READ_ID)
group by READ_ID