Sql 如何使用删除行的条件分组
我有一个表,它有三列,ID,Company,Result,如下所示: 我想做的是按ID/公司分组,并设置一个条件,如果同一ID在同一公司中同时有“找到”和“未找到”结果,我只想看到结果为“找到”的行 我应该能够在不同的公司获得同一主题的结果,但如果有多行ID/公司组合,则只能看到结果为“找到”的行 预期结果应如下所示: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
我该怎么做?这有点像是一组加上一个删除。您的解释有点难以理解,但根据您的数据,我认为您只需要聚合和
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;