Следующий запрос даст вам то, что вы хотите, без необходимости беспокоиться о процедурах.
select id
, sum(case when value in ('A', 'B', 'C', 'D', G') then 1 else 0 ) / count(*)
from my_table
group by id
В качестве альтернативы, если у вас есть для передачи строки "ABCDG" и получения результатаназад вы могли бы сделать:
select id
, sum(case when instr('A B C D G', value) <> 0 then 1 else 0 ) / count(*)
from my_table
group by id
Они включают в себя полное сканирование таблицы или полное сканирование индекса, если вы используете предложенный индекс ниже, поэтому вы можете добавить следующую фразу where, если хотите найти толькоids
с процентами> 0.
select id
, sum(case when instr('A B C D G', value) <> 0 then 1 else 0 ) / count(*)
from my_table
where exists ( select 1
from my_table
where id = mt.id
and instr('A B C D G', value) <> 0 )
group by id
Для всех запросов ваша таблица должна быть проиндексирована на my_table, id
в этом порядке.