我有下表:
personid INT,
takeid INT,
score INT
对于每个人来说,带有负值和正值。我需要一个查询:
1)如果给定的人至少有一个正面拍摄,请从正面拍摄的一组中取出最大值(得分)
2)当所有takeid为负数时,选择给定人物的最大值(得分)
有没有人知道如何做到这一点?
答案 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;