在Oracle中,获取最大值而忽略否定匹配记录

时间:2016-06-03 16:02:28

标签: sql oracle max negative-number

我的表格如下所示:

ID          Value

462338900   41040   
462338900   -41040  
462338900   50      
462338900   0   

我想要做的是从此表中获取值字段没有匹配的否定记录的最大值。在上面的示例中,41040将是最大值。但是,由于它具有-41040的负匹配记录,我想“抛弃它”并将新的最大值恢复为50.

2 个答案:

答案 0 :(得分:4)

以下是使用exists的方法:

select id, max(value)
from t
where not exists (select 1
                  from t t2
                  where t2.id = t.id and t2.value = - t.value
                 )
group by id;

答案 1 :(得分:2)

我赞同戈登的答案 - 这是正确的答案。但是,根据您的桌子有多大以及您一次只能追踪多少ids,这可能会更好,因为它只会读取一次表格。即,它不需要not exists所需的ANTI JOIN操作。

select id, max(value)  
from (
select id, abs(value) value, count(case when value < 0 then 1 else null end) neg_count
from t
group by id, abs(value) )
where neg_count = 0
group by id;

另外,小心..你非常具体地说明了你的要求。如果您的数据是

ID          Value
462338900   41040   
462338900   41040   
462338900   -41040  
462338900   50      
462338900   0  

...值为41040重复,单次出现-41040将从最大值的结果中排除两者为50.如果您希望在这种情况下最大值为41040,则&#39;一个不同的查询。与not exists方法相比,我的版本更适合该要求:您可以计算与pos_count类似的neg_count并将where neg_count=0更改为where pos_count > neg_count