トピックへの平均スタッフ応答時間

このデータエクスプローラーレポートは、指定された期間とカテゴリ内で作成されたトピックに対するスタッフメンバー(管理者とモデレーター)の平均応答時間を分析するように設計されています。

このレポートは、Discourseサイトでのスタッフのやり取りの効率性と応答性を理解するのに役立ち、コミュニティ管理にとって非常に重要です。

-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2024-01-30
-- int_list :categories = 0
-- boolean :include_subcategories = false

WITH filtered_topics AS (
    SELECT t.id AS topic_id, t.category_id, t.created_at::DATE AS created_at
    FROM topics t
    WHERE
      (
        ':categories' = '0'
        OR t.category_id IN
          (
            SELECT id
            FROM categories
            WHERE id IN(:categories)
              OR (:include_subcategories AND parent_category_id IN(:categories))
          )
      )
      AND t.created_at >= :start_date
      AND t.created_at < :end_date
      AND t.archetype = 'regular'
      AND t.deleted_at IS NULL
),
staff_replies AS (
    SELECT p.topic_id, MIN(p.created_at) AS first_staff_reply
    FROM posts p
    JOIN users u ON p.user_id = u.id
    WHERE (u.admin = true OR u.moderator = true)
      AND p.deleted_at IS NULL
      AND p.post_type = 1
    GROUP BY p.topic_id
),
response_times AS (
    SELECT
        ft.topic_id,
        ft.created_at AS topic_created_at,
        sr.first_staff_reply,
        ft.category_id as category_id,
        EXTRACT(EPOCH FROM (sr.first_staff_reply - ft.created_at)) / 3600 AS response_time_hours
    FROM filtered_topics ft
    LEFT JOIN staff_replies sr ON ft.topic_id = sr.topic_id
)
SELECT
    topic_id,
    category_id,
    topic_created_at,
    response_time_hours as staff_response_time_hours
FROM response_times
ORDER BY topic_created_at ASC

SQLクエリの説明

このレポートでは、いくつかの共通テーブル式(CTE)を使用してクエリを分解しています。

  • filtered_topics: このCTEは、日付範囲、カテゴリ、サブカテゴリを含めるかどうかなどの入力パラメータに基づいてトピックをフィルタリングします。削除されていない通常のアーキタイプトピックのみが考慮されることを保証します。
  • staff_replies: このCTEは、filtered_topics CTEで特定されたトピックに対するスタッフメンバー(管理者またはモデレーター)による最初の返信を特定します。削除された投稿を除外し、メイン投稿(post_type = 1)のみを考慮します。
  • response_times: このCTEは、トピックの作成時間と最初のスタッフ返信時間の差を計算して応答時間を計算します。結果は秒から時間に変換されます。

response_times CTEからの最終的なSELECTステートメントは、トピックID、カテゴリID、トピック作成日、および計算されたスタッフ応答時間(時間単位)を取得し、結果をトピック作成日で並べ替えます。

パラメータ

  • start_date (date): トピック作成の分析対象期間の開始日。
  • end_date (date): トピック作成の分析対象期間の終了日。
  • categories (int_list): トピックをフィルタリングするためのカテゴリIDのリスト。0に設定すると、すべてのカテゴリが含まれます。
  • include_subcategories (boolean): 分析に指定されたカテゴリのサブカテゴリを含めるかどうかを決定するフラグ。

結果

  • topic_id: トピックの一意の識別子。
  • category_id: トピックが属するカテゴリ。
  • topic_created_at: トピックが作成された日付。
  • staff_response_time_hours: スタッフがトピックに応答するのにかかった時間(時間単位)。NULL値は、トピックに対するスタッフの応答がないことを示します。

結果例

topic_id category_id topic_created_at staff_response_time_hours
101 5 2024-01-02 1.5
102 5 2024-01-02 3.2
103 12 2024-01-03 NULL
104 12 2024-01-04 0.75
「いいね!」 1

スタッフが開始したトピックを除外する簡単な方法はありますか?

「いいね!」 1

はい、スタッフユーザーが作成したトピックを除外するようにレポートを次のように変更できます。

-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2024-01-30
-- int_list :categories = 0
-- boolean :include_subcategories = false

WITH staff_users AS (
    SELECT id
    FROM users
    WHERE admin = true OR moderator = true
),
filtered_topics AS (
    SELECT t.id AS topic_id, t.category_id, t.created_at::DATE AS created_at
    FROM topics t
    LEFT JOIN staff_users su ON t.user_id = su.id
    WHERE
      (
        ':categories' = '0'
        OR t.category_id IN
          (
            SELECT id
            FROM categories
            WHERE id IN(:categories)
              OR (:include_subcategories AND parent_category_id IN(:categories))
          )
      )
      AND t.created_at >= :start_date
      AND t.created_at < :end_date
      AND t.archetype = 'regular'
      AND t.deleted_at IS NULL
      AND su.id IS NULL  -- Exclude topics created by staff
),
staff_replies AS (
    SELECT p.topic_id, MIN(p.created_at) AS first_staff_reply
    FROM posts p
    JOIN staff_users su ON p.user_id = su.id
    WHERE p.deleted_at IS NULL
      AND p.post_type = 1
    GROUP BY p.topic_id
),
response_times AS (
    SELECT
        ft.topic_id,
        ft.created_at AS topic_created_at,
        sr.first_staff_reply,
        ft.category_id as category_id,
        EXTRACT(EPOCH FROM (sr.first_staff_reply - ft.created_at)) / 3600 AS response_time_hours
    FROM filtered_topics ft
    LEFT JOIN staff_replies sr ON ft.topic_id = sr.topic_id
)
SELECT
    topic_id,
    category_id,
    topic_created_at,
    response_time_hours as staff_response_time
FROM response_times
ORDER BY topic_created_at ASC

変更点の解説:

  1. staff_users CTE: 管理者またはモデレーターであるユーザーを特定するための新しいCTEが追加されました。これにより、後続のステップでスタッフが作成したトピックを除外するのに役立ちます。
  2. filtered_topics CTE: このCTEには、staff_users CTEとのLEFT JOINが含まれるようになり、user_idがスタッフメンバーのIDと一致するトピックを除外します。これは su.id IS NULL をチェックすることで行われ、トピックがスタッフによって作成されていないことを保証します。
「いいね!」 1

ありがとうございます!結果は以前よりずっと落ち着きました。

ちくしょう、十分なスキルがあれば何でも簡単だ。

「いいね!」 1