Фильтрация данных, когда одно поле выше значения в зависимости от критериев другого поля - PullRequest
0 голосов
/ 12 ноября 2018

Не знаю, как озаглавить это (поэтому мне не повезло при поиске ответа), но, скажем, у меня есть следующая таблица:

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;

Мне нужно будет убедиться, что это достаточно быстро, когда я запускаюзапрос на всю таблицу (~ сотни тысяч строк).

1 Ответ

0 голосов
/ 12 ноября 2018

Один из вариантов может быть

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...