sql—如何按删除行的条件分组

ecfsfe2w  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(415)

我有一个表,它有三列,id,company,result,如下所示:

我想做的是按id/公司分组,如果同一个id在同一个公司中同时有“found”和“not found”结果,我只想看到结果为“found”的行。
我应该能够在不同的公司中得到同一主题的结果,但是如果有多行id/公司的组合,则只能看到结果为“found”的行
预期结果如下:

我该怎么做?它有点像是一个由删除组合而成的组。

kx5bkwkv

kx5bkwkv1#

你的解释有点难以理解,但根据你的数据,我认为你只需要聚合和 min() :

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

为什么这样做是因为,从字符串的Angular 来看, 'Found' 小于 'Not Found' (因为前者以 'F' 后者以 'N' ). 如果两个值都存在于组中, min() 退货 'Found' . 如果只存在一个值,则按原样返回。

pprl5pva

pprl5pva2#

你好像想要每个人的结果 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建议的聚合方法。

相关问题