グループの割り当てはグループ名で保存されます。グループ名の変更をどう処理しますか?

グループにいくつかのスレッドを割り当て、その後、グループが(理論的には)それらを個人に割り当てて処理します。

再割り当てまでの時間(期間)を示すレポートを作成しました。

再割り当てまでの時間を表示するレポート
-- 目標: グループへの割り当てからトピックのクローズ/解除割り当て/サブチームまたは個人への再割り当てまでの時間を検索する
--        まだ再割り当てされていない投稿については、時計はまだ動いているため、日付差に現在のタイムスタンプを使用します。
--
-- 注意: このレポートでは、日付範囲の開始前に行われた保留中の割り当ては省略されます。


-- [params]
-- date :start_date = 2023-01-01


WITH

-- 日付範囲内のグループ割り当て投稿を検索
group_assignment AS (
    SELECT p.topic_id
        , p.created_at as assign_date
        , pcf.value as group_name
        , post_number
    FROM posts p
    JOIN post_custom_fields pcf on pcf.post_id = p.id
    WHERE p.action_code in ('assigned_group', 'reassigned_group')
        AND p.created_at >= :start_date AND p.created_at < :start_date::date + INTERVAL '90 day'
    ORDER BY topic_id
),

-- グループ割り当て後の最小「割り当て変更」投稿の投稿番号を検索
assignment_change_post_number AS (
    SELECT min(p.post_number) as post_number
        , p.topic_id
        , ga.post_number as initial_assignment -- 後で使用するために転送
    FROM posts p
    JOIN group_assignment ga ON ga.topic_id = p.topic_id AND ga.post_number < p.post_number
    WHERE p.action_code in ('reassigned_group', 'reassigned', 'unassigned', 'unassigned_group'
                            , 'assigned' -- おそらくここでは表示されませんが、念のため...
                            , 'closed.enabled','autoclosed.enabled')  -- おそらく unassign*... と重複しますが...
    GROUP BY p.topic_id, ga.post_number
),

-- 投稿番号の変更日を検索
assignment_change_date AS (
    SELECT p.created_at as change_date
        , p.topic_id
        , acpn.initial_assignment -- 後で使用するために転送
    FROM posts p
    JOIN assignment_change_post_number acpn on p.topic_id=acpn.topic_id and p.post_number=acpn.post_number
),

-- 割り当てと割り当て変更の間で日付計算を行う
date_math AS (
    SELECT ga.group_name
        -- グループにまだ割り当てられている投稿については、「再割り当て日」として現在のタイムスタンプを使用
        , extract(epoch from (coalesce(acd.change_date, NOW()) - ga.assign_date)/86400) as days
    FROM group_assignment ga
    LEFT JOIN assignment_change_date acd on acd.topic_id = ga.topic_id
        AND ga.post_number=acd.initial_assignment
)


SELECT group_name as "チーム"
    , count(*) as "割り当て数"
    , round(avg(days)::numeric,2) as "再割り当てまでの平均日数"
    , round(max(days)::numeric,2) as "最大"
    , round(min(days)::numeric,5) as "最小"
FROM date_math
GROUP BY group_name
ORDER BY "再割り当てまでの平均日数" desc

これは、グループが(…の理由で)自己の名前を変更し始めたまでうまく機能していました。

スレッド割り当てレコードはグループIDではなく、割り当て時点のグループ名を格納するため、レポートの期間がリネームの前後の両方のレコードを含むかどうかによって、一部のグループに対して複数の行が現在表示されています。

これらを統合し、将来的にレポートを保護したいと考えています(したがって、同義語セットをハードコーディングするだけでは不十分です)。

古いグループ名/リネームの記録はどこかにありますか?それとも…何か他のものですか?

そうですか?元のassignmentテーブルにはIDしかなく、名前はありません。名前を基にしたCTEを使用しているあなたのDEレポートの副産物でしょうか?

「いいね!」 2

@Falco IIRC、assignmentテーブルには現在の状態が格納されています。履歴データが必要な場合(必要です)、以前の割り当て状態の割り当て値を取得するには post_custom_fields を確認する必要があります。

  SELECT p.topic_id
        , p.created_at as assign_date
        , pcf.value as group_name
        , post_number
    FROM posts p
    JOIN post_custom_fields pcf on pcf.post_id = p.id
    WHERE p.action_code in ('assigned_group', 'reassigned_group')
        AND p.created_at >= :start_date AND p.created_at < :start_date::date + INTERVAL '90 day'
    ORDER BY topic_id

それとも、違う場所を見ていますか?

「いいね!」 1

ああ、わかりました。すべての履歴の割り当てステータスの変更を追跡する必要があるのですね!これは確かに難しい問題です。1年前に、ある顧客がこの問題に適切に対処するための依頼をしてくれたので、それに対する仕様書をすべて作成しました。

これはほぼ2部構成の作業です。

まず、割り当ての状態遷移をテーブルに保存する必要があります(新しい割り当て、割り当ての変更(担当者またはステータスの変更)、割り当ての削除)。

次に、その情報を使用して、グラフとテーブルを備えたダッシュボードである新しいビューを強化する必要があります。

新しい設定

  • 割り当てレポートを有効にする
  • タイプ:ブール値
  • デフォルト:false

新しいUI

これは新しいページになります。/admin/dashboard/assignments が拡張可能であればそこ、または /admin/plugins/assign の下に配置されます。

ここで、ユーザーは期間、ユーザー/グループ、ステータスでフィルタリングして、割り当てに関するグラフを表示したり、データをエクスポートしたりできます。

割り当ての状態遷移の永続化

assignments テーブルは既に古い割り当てを保存していますが、割り当てステータスも追跡する必要があります。そのため、それを拡張するか、履歴の割り当てステータス専用のよりシンプルなテーブルを作成するかはわかりません。ホットシリアライザーで実際に結合されるテーブルを肥大化させないために、後者のルートを選択する誘惑に駆られます。

作業工数見積もり

UIを含めた全作業で2.5〜3週間
新しいテーブルのみで1週間

残念ながら、その顧客はこの作業に着手する前に優先度を下げてしまいましたが、これはあなたのニーズを解決するはずです。

「いいね!」 1

:joy:

カスタム開発の1か月分の資金提供以外に、以前のグループ名を検索する方法はありますか? :sweat_smile:

「いいね!」 1

group_histories テーブルにあると思います。参考になりますでしょうか?

「いいね!」 5

@JammyDodgerさん、ありがとうございます!そのテーブルを見ましたが、アクションコードに基づいたメンバーシップに関するものだと結論付けました。

もう一度確認したところ、探していたのは action=1 and subject='name' であることがわかりました。ありがとうございます!

「いいね!」 2

更新されたレポートを興味のある方に共有します。変更点は group_aliases クエリの追加(およびその使用)です。

-- 目標: 割り当てからグループへの時間を検索
--    トピックのクローズ/割り当て解除/サブチームまたは個人への再割り当てまで
--    再割り当てされていない投稿については、時計はまだ動いているため、
--    日付差には現在のタイムスタンプを使用します。
--
-- 注意: このレポートでは、日付範囲の開始前に行われた保留中の割り当ては省略されます。


-- [パラメータ]
-- 日付 :start_date = 2023-01-01


WITH

group_aliases AS (
    SELECT group_id,
            -- 列を行に変換
            UNNEST (array[prev_value, new_value]) AS "alias"
        FROM group_histories
        WHERE action = 1 AND subject='name'
    UNION
    SELECT id as group_id
            , name
        FROM groups

),
-- 日付範囲内のグループ割り当て投稿を検索
group_assignment AS (
    SELECT p.topic_id
        , p.created_at as assign_date
        , ga.group_id as group_id
        , post_number
    FROM posts p
    JOIN post_custom_fields pcf on pcf.post_id = p.id
    JOIN group_aliases ga on pcf.value = ga.alias
    WHERE p.action_code in ('assigned_group', 'reassigned_group')
        AND p.created_at >= :start_date AND p.created_at < :start_date::date + INTERVAL '90 day'
    ORDER BY topic_id
),

-- グループ割り当て後の最小「割り当て変更」投稿番号を検索
assignment_change_post_number AS (
    SELECT min(p.post_number) as post_number
        , p.topic_id
        , ga.post_number as initial_assignment -- 後で使用するために転送
    FROM posts p
    JOIN group_assignment ga ON ga.topic_id = p.topic_id AND ga.post_number < p.post_number
    WHERE p.action_code in ('reassigned_group', 'reassigned', 'unassigned', 'unassigned_group'
                            , 'assigned' -- ここでは表示されない可能性が高いですが、念のため...
                            , 'closed.enabled','autoclosed.enabled')  -- おそらく unassign*... と重複する
    GROUP BY p.topic_id, ga.post_number
),

-- 投稿番号の変更日を検索
assignment_change_date AS (
    SELECT p.created_at as change_date
        , p.topic_id
        , acpn.initial_assignment -- 後で使用するために転送
    FROM posts p
    JOIN assignment_change_post_number acpn on p.topic_id=acpn.topic_id and p.post_number=acpn.post_number
),

-- 割り当てと割り当て変更の間で日付計算を行う
date_math AS (
    SELECT ga.group_id as group_id
        -- グループにまだ割り当てられている投稿については、再割り当て日として現在のタイムスタンプを使用
        , extract(epoch from (coalesce(acd.change_date, NOW()) - ga.assign_date)/86400) as days
    FROM group_assignment ga
    LEFT JOIN assignment_change_date acd on acd.topic_id = ga.topic_id
        AND ga.post_number=acd.initial_assignment
)

SELECT date_math.group_id
    , count(*) as "割り当て数"
    , round(avg(days)::numeric,2) as "再割り当てまでの平均日数"
    , round(max(days)::numeric,2) as "最大"
    , round(min(days)::numeric,5) as "最小"
FROM date_math
GROUP BY group_id
ORDER BY "再割り当てまでの平均日数" desc
「いいね!」 3

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.