不确定如何为其命名(因此在尝试搜索答案时并不幸运),但可以说我有一个如下表:
PureComponent
,而我只想保留产品Provider1或Provider3或具有比Provider1或Provider3上该产品的最佳质量更高的质量的产品。所以我想结束:
Product Quality Source
P1 0.80 Provider1
P1 0.75 Provider2
P1 0.20 Provider3
P1 0.83 Provider4
P1 0.60 Provider5
P2 0.45 Provider1
P2 0.76 Provider2
P2 0.20 Provider3
P2 0.87 Provider4
P3 0.45 Provider1
P3 0.30 Provider2
P3 0.84 Provider4
P3 0.24 Provider5
我有很多数据,所以我正在寻找一种执行此操作的聪明方法。
蛮力类似于:
Product Quality Source
P1 0.80 Provider1
P1 0.20 Provider2
P1 0.83 Provider4
P2 0.45 Provider1
P2 0.76 Provider2
P2 0.20 Provider3
P2 0.87 Provider4
P3 0.45 Provider1
P3 0.84 Provider4
有什么建议吗?
谢谢
Edit1:通过略过每个产品可能有多个来源,我已经稍微简化了问题,现在我修改了帖子。
使用Littlefoot的建议:
select * from mytable m1 where m1.Source = 'Tier1' or m1.Source > (select max(m2.Quality) from mytable m2 where m2.Product = m1.Product and m2.Source = 'Tier1')
当我在整个表(约数十万行)上运行请求时,我将需要看看这是否足够快。
答案 0 :(得分:1)
一个选项可能是
SQL> with test (product, quality, source) as
2 (select 'P1', 0.8, 'Tier1' from dual union all
3 select 'P2', 0.75, 'Tier2' from dual union all
4 select 'P3', 0.2, 'Tier2' from dual union all
5 select 'P4', 0.83, 'Tier2' from dual union all
6 select 'P5', 0.6, 'Tier1' from dual
7 ),
8 inter as
9 (select product, quality, source,
10 (select max(quality) max_qual from test
11 where source = 'Tier1'
12 ) max_qual
13 from test
14 )
15 select product, quality, source
16 From inter
17 where source = 'Tier1'
18 or quality > max_qual;
PR QUALITY SOURC
-- ---------- -----
P1 ,8 Tier1
P4 ,83 Tier2
P5 ,6 Tier1
SQL>
或者:
<snip>
8 inter as
9 (select product, quality, source,
10 max(case when source = 'Tier1' then quality else 0 end) over (order by null) max_qual
11 from test
12 )
13 select product, quality, source
14 from inter
15 where source = 'Tier1'
16 or quality > max_qual;
PR QUALITY SOURC
-- ---------- -----
P1 ,8 Tier1
P4 ,83 Tier2
P5 ,6 Tier1
SQL>