如何用删除行的条件进行分组?

问题描述 投票:0回答:1

我有一个表,有三列,ID、公司、结果,是这样的。

Original Table

我想做的是通过IDCompany进行分组,并附加一个条件,如果同一个ID在同一个公司有 "发现 "和 "未发现 "的结果,我想只看到结果是 "发现 "的那一行。

我应该能够在不同的公司有同一主题的结果,但在有多行组合的情况下,IDCompany只看到结果是 "Found "的行。

预期的结果应该是这样的。

Expected result

我怎么能这样做?有点像分组与删除相结合。

sql group-by sql-delete
1个回答
1
投票

你的解释有点难懂,但根据你的数据,我认为你只是想进行聚合,而 min():

select id, company, min(result) result
from mytable
group by id, company

为什么会这样,因为,弦上。'Found' 小于 'Not Found' (因为前者是以 'F'而后者以 'N'). 所以如果这两个值都存在于组中。min() 返回 'Found'. 如果只有一个值,则按原样返回。


0
投票

你似乎想让每个 idcompany. 一个比较简单的方法是。

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建议的聚合方法。

© www.soinside.com 2019 - 2024. All rights reserved.