我有下表:
personid INT,
takeid INT,
score INT
对于每个人,takeid 都可以取负值和正值。我需要一个查询:
1) 当给定的人至少有一个正的 takeid 时,从一组正的 takeid 中取 max(score)
2)当所有的takeid都是负数时,为给定的人选择max(score)
有谁知道如何做到这一点?
这是另一个使用COALESCE
它查看是否有任何 takeid 大于 0 的选项,如果是,则使用其中的最大值。否则,只需使用最大值(分数)。
select personid,
coalesce(max(case when takeid > 0 then score end),max(score)) maxScore
from yourtable
group by personid
尝试:
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
select personid, max(score) keep (dense_rank last order by sign(takeid) asc)
from scoretable
group by personid
它也可以用 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;