Sql 如何使用删除行的条件分组

Sql 如何使用删除行的条件分组,sql,sql-server,tsql,group-by,sql-delete,Sql,Sql Server,Tsql,Group By,Sql Delete,我有一个表,它有三列,ID,Company,Result,如下所示: 我想做的是按ID/公司分组,并设置一个条件,如果同一ID在同一公司中同时有“找到”和“未找到”结果,我只想看到结果为“找到”的行 我应该能够在不同的公司获得同一主题的结果,但如果有多行ID/公司组合,则只能看到结果为“找到”的行 预期结果应如下所示: 我该怎么做?这有点像是一组加上一个删除。您的解释有点难以理解,但根据您的数据,我认为您只需要聚合和min(): 之所以这样做,是因为在字符串方面,'Found'小于'notf

我有一个表,它有三列,ID,Company,Result,如下所示:

我想做的是按ID/公司分组,并设置一个条件,如果同一ID在同一公司中同时有“找到”和“未找到”结果,我只想看到结果为“找到”的行

我应该能够在不同的公司获得同一主题的结果,但如果有多行ID/公司组合,则只能看到结果为“找到”的行

预期结果应如下所示:


我该怎么做?这有点像是一组加上一个删除。

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


之所以这样做,是因为在字符串方面,
'Found'
小于
'notfound'
(因为前者以
'F'
开头,而后者以
'N'
开头)。因此,如果组中同时存在这两个值,
min()
将返回
'Found'
。如果只存在一个值,它将按原样返回。

您似乎希望得到每个
id
/
公司的结果。一个相对简单的方法是:

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、公司、结果)
,这可能是最快的方法

您还可以将其组织为优先级:

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

实际上,您最好将数据以格式化文本的形式发布,然后我们可以复制并粘贴它以进行测试(您不需要发布图像)。您好,欢迎来到StackOverflow!请编辑您的问题,以便获得合适的答案。阅读有关如何使用的文档,并感谢您!非常感谢,这正是我所需要的,效果很好!对不起,英语不是我的母语,我已经尽力解释了。谢谢!你的和GMB都试过了,都很有效@GAF。我的回答是更一般的,以防您需要返回其他列。你应该接受其中一个答案。
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;