-- 目标:查找从分配到组到主题关闭/取消分配/重新分配给子团队或个人的时间
-- 对于尚未重新分配的帖子,计时器仍在运行,
-- 因此请在日期差异中使用当前时间戳
--
-- 请注意,此报告省略了日期范围开始之前进行的仍待处理的分配
-- [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
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
-- 目标:查找从分配到主题关闭/取消分配/重新分配给子团队或个人的时间
-- 对于尚未重新分配的帖子,计时器仍在运行,
-- 因此请在日期差异中使用当前时间戳
--
-- 注意:此报告省略了在日期范围开始之前进行的仍待处理的分配
-- [params]
-- date :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 "Assignments"
, round(avg(days)::numeric,2) as "Avg days to reassignment"
, round(max(days)::numeric,2) as "Max"
, round(min(days)::numeric,5) as "Min"
FROM date_math
GROUP BY group_id
ORDER BY "Avg days to reassignment" desc