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

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

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

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

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

kx5bkwkv

kx5bkwkv1#

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

  1. select id, company, min(result) result
  2. from mytable
  3. group by id, company

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

pprl5pva

pprl5pva2#

你好像想要每个人的结果 id / company . 一个相对简单的方法是:

  1. select t.*
  2. from t
  3. where t.result = 'Found' or
  4. not exists (select 1
  5. from t t2
  6. where t2.id = t.id and t2.company = t.company and t2.result = 'Found'
  7. );

带索引的 (id, company, result) ,这可能是最快的方法。
您还可以将其结构为优先顺序:

  1. select t.*
  2. from (select t.*,
  3. rank() over (partition by id, company
  4. order by result -- "Found" is before "Not Found"
  5. ) as seqnum
  6. from t
  7. ) t
  8. where seqnum = 1;

这两种方法都允许您返回任意数量的列—尽管对于三列和每个公司/id组合最多一行,您可以使用gmb建议的聚合方法。

展开查看全部

相关问题