1

毎月、アクション A またはアクション B を実行した # ユーザーを見つけようとしています。

表: ユーザー - id - "creationDate"

表: action_A - user_id (= user.id) - "creationDate"

表: action_B - user_id (= user.id) - "creationDate"

私がやろうとしていたことの一般的なアイデアは、月 X にアクション A を実行したユーザーのリストと、月 X にアクション B を実行したユーザーのリストを見つけて、毎月の ID の数を数えることでした。毎月の日付の generate_series に基づいています。

私は次のことを試しましたが、実行中にクエリがタイムアウトし、それを最適化する方法があるかどうか (またはそれが正しいかどうか) はわかりません。

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"

コメント/ヘルプは非常に役立ちます!

4

1 に答える 1

2

個別のユーザーをカウントする場合:

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
于 2014-09-26T09:42:03.883 に答える