SELECT
split_part(ue.email, '@', 2) AS email_domain, -- メールのアドレスからドメイン部分を抽出
COUNT(p.id) AS post_count
FROM
posts p
JOIN users u ON p.user_id = u.id
JOIN user_emails ue ON u.id = ue.user_id
AND ue.primary = TRUE -- プライマリメールを使用することを保証
LEFT JOIN group_users gu ON gu.user_id = u.id
LEFT JOIN GROUPS g ON gu.group_id = g.id
AND g.automatic = TRUE
WHERE
p.created_at >= CURRENT_DATE - INTERVAL '7 days' -- 過去7日間の投稿をフィルタリング
AND g.id IS NULL -- ユーザーが自動グループに属していないことを保証
GROUP BY
email_domain
ORDER BY
post_count DESC -- 結果を投稿数で降順に並べ替え
-- [params]
-- string :interval = 7 days
SELECT
split_part(ue.email, '@', 2) AS email_domain, -- メールからドメイン部分を抽出
COUNT(p.id) AS "合計投稿数",
COUNT(p.id) FILTER (WHERE p.post_number = 1 AND t.archetype = 'regular') AS "トピック",
COUNT(p.id) FILTER (WHERE p.post_number > 1 AND t.archetype = 'regular') AS "投稿",
COUNT(p.id) FILTER (WHERE t.archetype = 'private_message') AS "個人メッセージ投稿数"
FROM posts p
JOIN user_emails ue ON p.user_id = ue.user_id AND ue.primary = TRUE -- プライマリメールを使用することを保証
JOIN topics t ON t.id = p.topic_id
WHERE p.created_at >= CURRENT_DATE - INTERVAL :interval -- パラメータに基づいて過去x時間の投稿をフィルタリング
AND p.user_id > 0 -- システムユーザー(システムおよびボット)を除外
AND p.deleted_at ISNULL
AND t.deleted_at ISNULL
AND p.post_type <> 3
GROUP BY email_domain
ORDER BY "合計投稿数" DESC -- 結果を投稿数降順で並べ替え