Tempo até a primeira resposta do grupo para tópicos criados dentro de um período específico
Retorna o tempo até a primeira resposta de um membro de um determinado grupo para tópicos “comuns” (não Mensagens Privadas) criados por um usuário que não é membro do grupo especificado. O parâmetro :group_name da consulta é definido como “staff” por padrão. Com esse valor, ela retornará o tempo até a primeira resposta por membros da equipe. Você pode alterar o valor desse parâmetro para obter tempos de resposta de diferentes grupos. Por exemplo, “customer_support”.
Observe que, tecnicamente, as datas devem ser fornecidas no formato aaaa-mm-dd, mas a consulta também aceitará datas no formato dd-mm-aaaa.
-- [params]
-- date :start_date
-- date :end_date
-- string :group_name = staff
WITH group_response_times AS (
SELECT
t.category_id,
t.id AS topic_id,
EXTRACT(EPOCH FROM (p.created_at - t.created_at)) / 60 AS response_time_minutes,
p.user_id AS staff_user_id,
ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY p.created_at) AS row_num
FROM posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.user_id NOT IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND p.user_id IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
AND p.post_type = 1
AND p.deleted_at IS NULL
AND t.created_at BETWEEN :start_date AND :end_date
)
SELECT
category_id,
topic_id,
staff_user_id,
ROUND(response_time_minutes::numeric, 2) AS response_time_minutes
FROM group_response_times
WHERE row_num = 1
ORDER BY category_id, response_time_minutes
Tempo médio até a primeira resposta do grupo por categoria:
Utiliza a mesma lógica da consulta anterior, mas retorna o tempo médio até a primeira resposta por membros do grupo especificado, por categoria, para tópicos criados por usuários que não são membros do grupo dentro do período definido pelos parâmetros :start_date e :end_date. Assim como na consulta anterior, se o parâmetro :group_name for mantido com seu valor padrão de “staff”, ela retornará os tempos médios de primeira resposta da equipe para tópicos comuns criados por usuários que não são da equipe.
-- [params]
-- date :start_date
-- date :end_date
-- string :group_name = staff
WITH group_response_times AS (
SELECT
t.category_id,
t.id AS topic_id,
EXTRACT(EPOCH FROM (p.created_at - t.created_at)) / 60 AS response_time_minutes,
p.user_id AS staff_user_id,
ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY p.created_at) AS row_num
FROM posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.user_id NOT IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND p.user_id IN (SELECT user_id
FROM group_users gu JOIN groups g ON g.id = gu.group_id
WHERE gu.user_id > 0 AND g.name = :group_name)
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
AND p.post_type = 1
AND p.deleted_at IS NULL
AND t.created_at BETWEEN :start_date AND :end_date
)
SELECT
category_id,
ROUND(AVG (response_time_minutes)::numeric, 2) AS average_response_time_minutes,
COUNT(*) AS num_topics_with_staff_responses
FROM group_response_times
WHERE row_num = 1
GROUP BY category_id

