Группировать данные по части строки в oracle sql (Oracle9i Enterprise Edition, выпуск 9.2.0.4.0) - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть следующий запрос:

select referrer, count(distinct ad_id) as Adverts,
       sum(case f when 'Y' then hits else 0 end) as clicks,
       sum(case f when 'N' then hits else 0 end) as views
from advert_view_hits
where ad_id in ({$id_strings})
group by referrer"

Это вернет данные, подобные следующим:

 Referrer  Adverts  Clicks  Views
 Caterer     3       124     74
 Indeed      5       234     136

Что хорошо, но в некоторых случаях реферер был сохранен в БД, как это:

user1@jwrecruitment.co.uk_200890,
user2@jwrecruitment.co.uk_200890

user1@gatewayjobs.co.uk_200890, 
user3@towngate-personnel.co.uk_2

Как бы я go о группировке данных, основанных только на компании пользовательских электронных писем, которые использовались в качестве реферала.

чтобы данные выглядели так:

Referrer             Adverts  Clicks  Views
 Caterer               3       124     74
 Indeed                5       234     136
 jwrecruitment.co.uk   8       456     782 
 gatewayjobs.co.uk     9       897     959

Чтобы все данные для электронных писем, таких как jwrecruitment.co.uk, были сгруппированы и отображены.

Ответы [ 3 ]

0 голосов
/ 07 апреля 2020

Если я правильно понимаю, вы можете взять все после @ - и вы можете сделать это, используя regexp_substr():

select regexp_substr(referrer, '[^@]+$') as referrer, count(distinct ad_id) as Adverts,
       sum(case f when 'Y' then hits else 0 end) as clicks,
       sum(case f when 'N' then hits else 0 end) as views
from advert_view_hits
where ad_id in ({$id_strings})
group by regexp_substr(referrer, '[^@]+$') ;

Вы можете заменить regexp_substr() logi c на :

select substr(referrer, instr(referrer, '@') + 1) as referrer, count(distinct ad_id) as Adverts,
       sum(case f when 'Y' then hits else 0 end) as clicks,
       sum(case f when 'N' then hits else 0 end) as views
from advert_view_hits
where ad_id in ({$id_strings})
group by  substr(referrer, instr(referrer, '@') + 1) ;
0 голосов
/ 07 апреля 2020

Вы также можете использовать regexp_substr, чтобы найти строку между @ и _ следующим образом:

select REGEXP_SUBSTR(referrer,'@([^_]+)',1,1,NULL,1) referrer, 
       count(distinct ad_id) as Adverts,
       sum(case f when 'Y' then hits else 0 end) as clicks,
       sum(case f when 'N' then hits else 0 end) as views
  from advert_view_hits
where ad_id in ({$id_strings})
group by REGEXP_SUBSTR(referrer,'@([^_]+)',1,1,NULL,1)

Если вы используете более старую версию, тогда вместо regexp_substr используйте комбинацию SUBSTR и INSTR следующим образом:

SUBSTR(referrer, 
       INSTR(referrer, '@') + 1, 
       DECODE(INSTR(referrer, '_', - 1), 
              0, 
              LENGTH(referrer) - INSTR(referrer, '@'), 
              INSTR(referrer, '_', - 1) - INSTR(referrer, '@') - 1)
      )
0 голосов
/ 07 апреля 2020

Если бы я следовал за вами правильно, вы могли бы использовать regexp_replace():

select 
    regexp_replace(referrer, '^.*@([^_]+).*$', '\1') referrer, 
    count(distinct ad_id) as Adverts,
    sum(case f when 'Y' then hits else 0 end) as clicks,
    sum(case f when 'N' then hits else 0 end) as views
from advert_view_hits
where ad_id in ({$id_strings})
group by regexp_replace(referrer, '^.*@([^_]+).*$', '\1')

Регулярное выражение совпадает на реферере, содержащем аробаз, и захватывает часть после аробаса и перед следующим подчеркиванием. Если реферер не соответствует регулярному выражению, он остается нетронутым.

...