Я пытаюсь найти # пользователей, которые выполняли действие 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"
Любые комментарии/помощь были бы очень полезными!
ИМО это очиститель использовать 'date_trunc ('месяц', "CreationDate")' вместо 'to_char'. В противном случае выглядит здоровым. Каков вывод 'EXPLAIN' для запроса? –
Вы хотите считать различные идентификаторы в каждом месяце или итоговых идентификаторах? –
спасибо! Клодоалдо ответил на мой вопрос, да, я пытался подсчитать разные идентификаторы :) Я буду использовать date_trunc в будущем! :) – christinang89