1

Я пытаюсь найти # пользователей, которые выполняли действие A или действие B на ежемесячной основе.Присоединиться к generate_series и count

Таблица: Пользователь - ID - "CreationDate"

Таблица: action_A - идентификатор_пользователь (= user.id) - "CreationDate"

Таблица: action_B - идентификатор_пользователь (= пользователь. id) - «creationDate»

Общая идея того, что я пытался сделать, это то, что я найду список пользователей, которые сделали действие A в месяце X, и список пользователей, которые выполняли действие B в месяце X , тогда подсчитайте, как ma ny ids существуют для каждого месяца на основе генерации_серии ежемесячных дат.

Я пробовал следующее, однако, время выполнения запроса при запуске, и я не уверен, есть ли способ его оптимизировать (или если он даже правильный).

SELECT monthseries."Month", count(*) 
FROM 
    (SELECT to_char(DAY::date, 'YYYY-MM') AS "Month" 
    FROM generate_series('2014-01-01'::date, CURRENT_DATE, '1 month') DAY) monthseries 
LEFT JOIN 
    (SELECT to_char("creationDate", 'YYYY-MM') AS "Month", 
      id 
    FROM action_A) did_action_A ON monthseries."Month" = did_action_A."Month" 
LEFT JOIN 
    (SELECT to_char("creationDate", 'YYYY-MM') AS "Month", 
      id 
    FROM action_B) did_action_B ON monthseries."Month" = did_action_B."Month" 
GROUP BY monthseries."Month" 

Любые комментарии/помощь были бы очень полезными!

+0

ИМО это очиститель использовать 'date_trunc ('месяц', "CreationDate")' вместо 'to_char'. В противном случае выглядит здоровым. Каков вывод 'EXPLAIN' для запроса? –

+0

Вы хотите считать различные идентификаторы в каждом месяце или итоговых идентификаторах? –

+0

спасибо! Клодоалдо ответил на мой вопрос, да, я пытался подсчитать разные идентификаторы :) Я буду использовать date_trunc в будущем! :) – christinang89

ответ

1

Если вы хотите считать отдельных пользователей:

select to_char(month, 'YYYY-MM') as "Month", count(*) 
from 
    generate_series(
     '2014-01-01'::date, current_date, '1 month' 
    ) monthseries (month) 
    left join (
     (
      select distinct date_trunc('month', "creationDate") as month, id 
      from action_a 
     ) a 
     full outer join (
      select distinct date_trunc('month', "creationDate") as month, id 
      from action_b 
     ) b using (month, id) 
    ) s using (month) 
group by 1 
order by 1 
+0

спасибо! есть небольшая синтаксическая ошибка «... b при использовании (month, id)» «on» не требуется :) – christinang89

+0

@ christinang89 Конечно, исправлено –

Смежные вопросы