我有一个表,它有三列,id,company,result,如下所示:我想做的是按id/公司分组,如果同一个id在同一个公司中同时有“found”和“not found”结果,我只想看到结果为“found”的行。我应该能够在不同的公司中得到同一主题的结果,但是如果有多行id/公司的组合,则只能看到结果为“found”的行预期结果如下:我该怎么做?它有点像是一个由删除组合而成的组。
kx5bkwkv1#
你的解释有点难以理解,但根据你的数据,我认为你只需要聚合和 min() :
min()
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 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 ) 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建议的聚合方法。