我有一个表,它有三列,id,company,result,如下所示:我想做的是按id/公司分组,如果同一个id在同一个公司中同时有“found”和“not found”结果,我只想看到结果为“found”的行。我应该能够在不同的公司中得到同一主题的结果,但是如果有多行id/公司的组合,则只能看到结果为“found”的行预期结果如下:我该怎么做?它有点像是一个由删除组合而成的组。
kx5bkwkv1#
你的解释有点难以理解,但根据你的数据,我认为你只需要聚合和 min() :
min()
select id, company, min(result) resultfrom mytablegroup by id, company
select id, company, min(result) result
from mytable
group by id, company
为什么这样做是因为,从字符串的Angular 来看, 'Found' 小于 'Not Found' (因为前者以 'F' 后者以 'N' ). 如果两个值都存在于组中, min() 退货 'Found' . 如果只存在一个值,则按原样返回。
'Found'
'Not Found'
'F'
'N'
pprl5pva2#
你好像想要每个人的结果 id / company . 一个相对简单的方法是:
id
company
select t.*from twhere 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' );
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) ,这可能是最快的方法。您还可以将其结构为优先顺序:
(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 ) twhere seqnum = 1;
from (select t.*,
rank() over (partition by id, company
order by result -- "Found" is before "Not Found"
) as seqnum
) t
where seqnum = 1;
这两种方法都允许您返回任意数量的列—尽管对于三列和每个公司/id组合最多一行,您可以使用gmb建议的聚合方法。
2条答案
按热度按时间kx5bkwkv1#
你的解释有点难以理解,但根据你的数据,我认为你只需要聚合和
min()
:为什么这样做是因为,从字符串的Angular 来看,
'Found'
小于'Not Found'
(因为前者以'F'
后者以'N'
). 如果两个值都存在于组中,min()
退货'Found'
. 如果只存在一个值,则按原样返回。pprl5pva2#
你好像想要每个人的结果
id
/company
. 一个相对简单的方法是:带索引的
(id, company, result)
,这可能是最快的方法。您还可以将其结构为优先顺序:
这两种方法都允许您返回任意数量的列—尽管对于三列和每个公司/id组合最多一行,您可以使用gmb建议的聚合方法。