根据条件从表中选择不同的值

时间:2016-02-25 15:41:48

标签: sql oracle plsql oracle-sqldeveloper

表格结构如下:

++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查询实现此目的。

3 个答案:

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