Как сделать мой запрос быстрее с помощью самостоятельного соединения? - PullRequest
0 голосов
/ 18 сентября 2018

Первоначально я пытался создать два разных запроса и затем объединить их в R, чтобы получить кумулятивный график времени, но я пытаюсь просто получить нужную информацию в одном запросе.

Исходный код:

users <- dbGetQuery(pool, "select id, name
                    from schema.table
                    where (name like '%t%' and name like '%2018%') or
                    (name like '%t%' and name like '%2017%')")
opts <- dbGetQuery(pool, "select id, name, ts
                    from schema.table
                    where name = 'qr_optin'")

all <- merge(users, opts, by = "id")

all <- all %>% 
  mutate(date =  as.Date(all$ts),
         name.x = gsub("t", "", name.x)) %>% 
  group_by(name.x, date) %>% 
  summarise(n = n()) 

Который выводит что-то вроде этого:

name          date         n 
x          2018-09-09      12
x          2018-09-08      5
y          2018-09-08      4
xy         2018-09-06      8
xy         2018-09-04      9

Я пытаюсь получить информацию, по крайней мере, с двумя объединенными запросами, но я только сделал это так далеко, и это безумномедленный.

select f1.id, f1.name, f2.ts
from schema.table f1
left join schema.table f2 on f2.id = f1.id
where f2.name = ' qr_optin' and
(f1.name like '%t%' and f1.name like '%2018%') or
(f1.name like '%t%' and f1.name like '%2017%')

1 Ответ

0 голосов
/ 19 сентября 2018

Просто запустите чистый SQL в Postgres либо для слияния (т. Е. Объединения), либо для суммирования (т. Е. Агрегирования)

Уровень объединения запрос

select usrs.id, usrs.name, opts.ts
from schema.table as usrs
inner join rvv.fbm as opts 
        on opts.id = usrs.id and opts.name = 'qr_optin'
where (name like '%t%' and name like '%2018%') or
      (name like '%t%' and name like '%2017%')

Агрегация запрос (с CTE)

with cte as 
  ( 
    select usrs.id, Replace(usrs.name, "t", "") as usr_name, opts.ts
    from schema.table as usrs
    inner join rvv.fbm as opts 
            on opts.id = usrs.id and opts.name = 'qr_optin'
    where (name like '%t%' and name like '%2018%') or
          (name like '%t%' and name like '%2017%')
  )

select cte.usr_name as name, cte.ts as date, count(*) as n
from cte
group by cte.name, cte.ts

Передать любой запрос в R в DBI::dbGetQuery вызов.

all <- dbGetQuery(pool, "...myquery...")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...