我的表格如下所示:
ID Value
462338900 41040
462338900 -41040
462338900 50
462338900 0
我想要做的是从此表中获取值字段没有匹配的否定记录的最大值。在上面的示例中,41040将是最大值。但是,由于它具有-41040的负匹配记录,我想“抛弃它”并将新的最大值恢复为50.
答案 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
。