Oracle - 从一个集合中选择max,如果set为空,则从另一个集合中选择

时间:2013-05-28 11:34:14

标签: sql oracle

我有下表:

personid INT,
takeid INT,
score INT

对于每个人来说,带有负值和正值。我需要一个查询:

1)如果给定的人至少有一个正面拍摄,请从正面拍摄的一组中取出最大值(得分)

2)当所有takeid为负数时,选择给定人物的最大值(得分)

有没有人知道如何做到这一点?

4 个答案:

答案 0 :(得分:4)

这是使用COALESCE的另一个选项,用于查看是否有任何takeid大于0,如果是,则使用其中的最大值。否则,只需使用max(得分)。

select personid, 
  coalesce(max(case when takeid > 0 then score end),max(score)) maxScore
from yourtable
group by personid

答案 1 :(得分:2)

尝试:

select personid, 
       case sign(max(takeid))
            when 1 then max(case sign(takeid) when 1 then score)
            else max(score)
       end as maxscore
from scoretable
group by personid

答案 2 :(得分:2)

select personid, max(score) keep (dense_rank last order by sign(takeid) asc) 
  from scoretable
 group by personid

答案 3 :(得分:1)

它也可以通过NVL和子选择来解决:

select NVL((select max(score) from scoretable t1 where t1.personid = :personid and takeid > 0),
           (select max(score) from scoretable t2 where t2.personid = :personid)
  from scoretable
 group by personid;