Gruppenzuweisungen werden nach Gruppennamen gespeichert. Wie geht man mit der Umbenennung von Gruppen um?

Wir weisen einige Threads Gruppen zu, und dann weisen die Gruppen (theoretisch) die Threads den einzelnen Personen zur Bearbeitung zu.

Wir haben einen Bericht erstellt, der die Zeit (Dauer) bis zur Neuzuweisung anzeigt.

Bericht zur Anzeige der Zeit bis zur Neuzuweisung
-- Ziel: Zeit von der Zuweisung zur Gruppe finden
--    bis zur Schließung des Themas / Abmeldung / Neuzuweisung an ein Unterteam oder eine Einzelperson
--    Für Beiträge, die noch nicht neu zugewiesen wurden, läuft die Uhr noch,
--      verwenden Sie daher den aktuellen Zeitstempel in der Datumsdifferenz
--
-- HINWEIS: Dieser Bericht lässt noch ausstehende Zuweisungen aus, die vor Beginn des Datumsbereichs vorgenommen wurden.


-- [Parameter]
-- Datum :start_datum = 2023-01-01


MIT

-- Gruppenzuweisungsbeiträge im Datumsbereich finden
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
),

-- Beitragsnummer der niedrigsten "Zuweisungsänderung" nach Gruppenzuweisung finden
assignment_change_post_number AS (
    SELECT min(p.post_number) as post_number
        , p.topic_id
        , ga.post_number as initial_assignment -- zur späteren Verwendung in einem Join weiterleiten
    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' -- wahrscheinlich wird dieser hier nicht angezeigt, aber zur Sicherheit...
                            , 'closed.enabled','autoclosed.enabled')  -- wahrscheinlich redundant mit unassign*...
    GROUP BY p.topic_id, ga.post_number
),

-- Änderungsdatum für Beitragsnummer nachschlagen
assignment_change_date AS (
    SELECT p.created_at as change_date
        , p.topic_id
        , acpn.initial_assignment -- zur späteren Verwendung in einem Join weiterleiten
    FROM posts p
    JOIN assignment_change_post_number acpn on p.topic_id=acpn.topic_id and p.post_number=acpn.post_number
),

-- Datumsberechnung zwischen Zuweisung und Zuweisungsänderung durchführen
date_math AS (
    SELECT ga.group_name
        -- für noch der Gruppe zugewiesene Beiträge, aktuellen Zeitstempel als "Neuzuweisungsdatum" verwenden
        , 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 "Team"
    , count(*) as "Zuweisungen"
    , round(avg(days)::numeric,2) as "Durchschnittliche Tage bis zur Neuzuweisung"
    , round(max(days)::numeric,2) as "Max"
    , round(min(days)::numeric,5) as "Min"
FROM date_math
GROUP BY group_name
ORDER BY "Durchschnittliche Tage bis zur Neuzuweisung" desc

Das hat gut funktioniert, bis die Gruppen anfingen, sich umzubenennen (aus … Gründen.)

Da die Thread-Zuweisungsdatensätze Gruppennamen speichern - zum Zeitpunkt der Zuweisung - und nicht Gruppen-IDs, haben wir jetzt mehrere Zeilen im Bericht für einige Gruppen (abhängig davon, ob der Berichtszeitraum Datensätze von vor und nach der Umbenennung enthält).

Ich möchte sowohl die Duplikate konsolidieren als auch diesen Bericht zukunftssicher machen (daher reicht es nicht aus, nur die Synonymmengen fest zu codieren).

Gibt es irgendwo eine Aufzeichnung von alten Gruppennamen / Umbenennungen? Oder… etwas anderes?

Stimmt das? Die ursprüngliche Tabelle assignment enthält nur IDs, keine Namen. Vielleicht ist das eine Kollateralschädigung Ihres DE-Berichts, der eine CTE basierend auf Namen verwendet?

2 „Gefällt mir“

@Falco IIRC hält die Zuweisungstabelle den aktuellen Zustand. Wenn ich historische Daten möchte (und das möchte ich), muss ich in post_custom_fields nach dem Zuweisungswert früherer Zuweisungszustände suchen.

  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

Oder suche ich an der falschen Stelle?

1 „Gefällt mir“

Ohhh ich verstehe jetzt, Sie müssen alle historischen Änderungen des Zuweisungsstatus verfolgen! Das ist in der Tat ein schwieriges Problem, und wir hatten einen Kunden, der vor einem Jahr eine Möglichkeit in Auftrag gab, dieses Problem richtig anzugehen. Daher habe ich eine vollständige Spezifikation dafür geschrieben:

Dies ist fast eine zweiteilige Aufgabe.

Zuerst müssen wir Zuweisungsübergänge in einer Tabelle speichern (neue Zuweisung, geänderte Zuweisung (Zuweisender oder Statusänderung), Zuweisung löschen).

Dann müssen wir diese Informationen verwenden, um eine neue Ansicht zu erstellen, die ein Dashboard mit Diagrammen und Tabellen ist.

Neue Einstellungen

  • Zuweisungsberichte aktivieren
  • Typ: bool
  • Standard: false

Neue Benutzeroberfläche

Dies wird eine neue Seite sein, entweder unter /admin/dashboard/assignments, wenn dies erweiterbar ist, oder unter /admin/plugins/assign.

Dort können Benutzer Diagramme anzeigen und Daten zu Zuweisungen exportieren, gefiltert nach Zeitraum, Benutzer/Gruppen und Status.

Speichern des Zustandsübergangs von Zuweisungen

Die Tabelle assignments speichert bereits alte Zuweisungen, aber wir müssen auch den Zuweisungsstatus verfolgen. Daher bin ich mir nicht sicher, ob wir diese erweitern oder einfach eine einfachere Tabelle speziell für historische Zuweisungszustände erstellen sollen. Ich wäre versucht, den letzteren Weg zu gehen, damit wir die Tabelle, die tatsächlich mit unseren heißen Serialisierern verknüpft ist, nicht aufblähen.

Aufwandsschätzung

2,5 bis 3 Wochen für die vollständige Arbeit mit Benutzeroberfläche
1 Woche nur für die neue Tabelle

Leider hat der Kunde diese Arbeit vorzeitig zurückgestellt, bevor wir dazu kamen, aber dies würde Ihre Anforderungen erfüllen.

1 „Gefällt mir“

:joy:

Gibt es eine Möglichkeit, frühere Gruppennamen nachzuschlagen, ohne einen Monat benutzerdefinierte Entwicklung zu finanzieren? :sweat_smile:

1 „Gefällt mir“

Ich glaube, sie sind in der group_histories-Tabelle, falls das hilft?

5 „Gefällt mir“

Danke @JammyDodger! Ich hatte mir diese Tabelle angesehen, kam aber zu dem Schluss, dass es sich um eine Mitgliedschaft basierend auf den Aktionscodes handelte

Du hast mich dazu gebracht, noch einmal nachzusehen, und ich habe festgestellt, dass action=1 and subject='name' das ist, wonach ich gesucht habe. Danke!

2 „Gefällt mir“

Aktualisierter Bericht für alle Interessierten. Die Änderung ist die Hinzufügung der group_aliases-Abfrage (und ihrer Verwendung):

-- Ziel: Zeit von der Zuweisung zur Gruppe finden
--    zur Schließung/Aufhebung der Zuweisung/erneuten Zuweisung an Unterteam oder Einzelperson
--    Für Beiträge, die nicht neu zugewiesen wurden, läuft die Uhr noch,
--      daher die aktuelle Zeitstempel-Differenz
--
-- BEACHTEN SIE, dass dieser Bericht noch ausstehende Zuweisungen auslässt, die vor Beginn des Datumsbereichs vorgenommen wurden


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


WITH
group_aliases AS (
    SELECT group_id,
            -- Spalten in Zeilen umwandeln
            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

),
-- Beitragszuweisungen zur Gruppe im Datumsbereich finden
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
),

-- Beitragsnummer der niedrigsten "Zuweisungsänderung" nach Gruppenzuweisung finden
assignment_change_post_number AS (
    SELECT min(p.post_number) as post_number
        , p.topic_id
        , ga.post_number as initial_assignment -- zur Weitergabe für die spätere Verknüpfung
    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' -- wahrscheinlich wird dieser hier nicht angezeigt, aber zur Sicherheit...
                            , 'closed.enabled','autoclosed.enabled')  -- wahrscheinlich redundant mit unassign*...
    GROUP BY p.topic_id, ga.post_number
),

-- Änderungsdatum für Beitragsnummer nachschlagen
assignment_change_date AS (
    SELECT p.created_at as change_date
        , p.topic_id
        , acpn.initial_assignment -- zur Weitergabe für die spätere Verknüpfung
    FROM posts p
    JOIN assignment_change_post_number acpn on p.topic_id=acpn.topic_id and p.post_number=acpn.post_number
),

-- Datumsberechnung zwischen Zuweisung und Zuweisungsänderung
date_math AS (
    SELECT ga.group_id as group_id
        -- für Beiträge, die noch der Gruppe zugewiesen sind, aktuellen Zeitstempel als "Wiederzuweisungsdatum" verwenden
        , 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 "Zuweisungen"
    , round(avg(days)::numeric,2) as "Durchschnittliche Tage bis zur Wiederzuweisung"
    , round(max(days)::numeric,2) as "Max"
    , round(min(days)::numeric,5) as "Min"
FROM date_math
GROUP BY group_id
ORDER BY "Durchschnittliche Tage bis zur Wiederzuweisung" desc
3 „Gefällt mir“

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