根据另一个字段条件过滤其中一个字段高于值的数据

时间:2018-11-12 19:48:05

标签: oracle

不确定如何为其命名(因此在尝试搜索答案时并不幸运),但可以说我有一个如下表:

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')

当我在整个表(约数十万行)上运行请求时,我将需要看看这是否足够快。

1 个答案:

答案 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>