我有一个表,有三列,ID、公司、结果,是这样的。
我想做的是通过IDCompany进行分组,并附加一个条件,如果同一个ID在同一个公司有 "发现 "和 "未发现 "的结果,我想只看到结果是 "发现 "的那一行。
我应该能够在不同的公司有同一主题的结果,但在有多行组合的情况下,IDCompany只看到结果是 "Found "的行。
预期的结果应该是这样的。
我怎么能这样做?有点像分组与删除相结合。
你的解释有点难懂,但根据你的数据,我认为你只是想进行聚合,而 min()
:
select id, company, min(result) result
from mytable
group by id, company
为什么会这样,因为,弦上。'Found'
小于 'Not Found'
(因为前者是以 'F'
而后者以 'N'
). 所以如果这两个值都存在于组中。min()
返回 'Found'
. 如果只有一个值,则按原样返回。
你似乎想让每个 id
company
. 一个比较简单的方法是。
select t.*
from t
where t.result = 'Found' or
not exists (select 1
from t t2
where t2.id = t.id and t2.company = t.company and t2.result = 'Found'
);
有了一个指数 (id, company, result)
,这可能是最快的方法。
你也可以将其结构化为一个优先级。
select t.*
from (select t.*,
rank() over (partition by id, company
order by result -- "Found" is before "Not Found"
) as seqnum
from t
) t
where seqnum = 1;
这两种方法都允许你返回任意数量的列--尽管对于三列和每个公司id组合最多一行,你可以使用GMB建议的聚合方法。