Не знаю, как озаглавить это (поэтому мне не повезло при поиске ответа), но, скажем, у меня есть следующая таблица:
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
, и я хочу толькохранить продукты, которые являются либо Provider1, либо Provider3, либо имеют более высокое качество, чем лучшие качества этого продукта на Provider1 или Provider3.Итак, я хотел бы в итоге:
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
У меня довольно много данных, поэтому я ищу умный способ сделать это.
Грубая сила будетбыть что-то вроде:
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')
Любое предложение?
Спасибо
Edit1: Я немного упростил задачупропуская, что у каждого продукта может быть несколько источников, я теперь исправил свой пост.
Используя предложение Littlefoot:
with inter as
(
select m1.product, m1.quality, m1.source,
(select max(m2.quality) from mytable m2
where m2.product = m1.product
and m2.source in ('Provider1', 'Provider3')
) max_quality
from mytable m1
)
select product, quality, source from inter
where source in ('Provider1', 'Prodiver3')
or quality > max_quality;
Мне нужно будет убедиться, что это достаточно быстро, когда я запускаюзапрос на всю таблицу (~ сотни тысяч строк).