Time to first response by group members

Нет, не актуален. Честно говоря, я не уверен, как он вообще когда-то работал. Скоро я опубликую обновлённую версию и отмечу вас, чтобы сообщить, что она готова.

Редактирование: @IreneT
Вот исправленная версия исходного запроса. Я бы проигнорировал тот запрос и вместо него посмотрел на другие запросы, которые я опубликовал в этом ответе. Дайте знать, если у вас возникнут вопросы по запросам или если вы столкнётесь с проблемами при добавлении необходимых параметров в запросы. По результатам тестирования сегодня я обнаружил, что мне приходится обновлять страницу после сохранения запроса в Data Explorer, чтобы поля ввода параметров появились под запросом. (Это может быть просто особенностью моего локального сайта разработки.)

-- [params]
-- int :months_ago = 1

WITH query_period AS (
SELECT
date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' as period_start,
date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' + INTERVAL '1 month' - INTERVAL '1 second' as period_end
),
staff_responses AS (
SELECT
DISTINCT ON (p.topic_id)
p.topic_id,
p.created_at,
t.category_id,
EXTRACT(MINUTE FROM (p.created_at - t.created_at)) AS response_time
FROM posts p
JOIN topics t
ON t.id = p.topic_id
AND t.category_id = ANY ('{46,25,43,40,44,35,22,7,20,17,6,12}'::int[])
JOIN users u
ON u.id = p.user_id
WHERE p.post_number > 1
AND u.admin = 't' OR u.moderator = 't'
ORDER BY p.topic_id, p.created_at
),
user_topics AS (
SELECT
t.id
FROM topics t
JOIN users u
ON u.id = t.user_id
WHERE u.admin = 'f' AND u.moderator = 'f'
)

SELECT
sr.category_id,
AVG(sr.response_time) AS "Average First Response Time",
COUNT(1) AS "Topics Responded to"
FROM staff_responses sr
JOIN query_period qp
ON sr.created_at >= qp.period_start
AND sr.created_at <= qp.period_end
JOIN user_topics t
ON t.id = sr.topic_id
GROUP BY sr.category_id

Что было изменено:

--DATE_TRUNC('minute', p.created_at - t.created_at) AS response_time
EXTRACT(MINUTE FROM (p.created_at - t.created_at)) AS response_time

Я был бы удивлён, если бы написал старый запрос без его тестирования. В любом случае, обновлённая версия теперь работает как ожидалось.

По памяти, этот запрос был написан для конкретного сайта и не предназначался для публикации на Meta. Вот ещё несколько полезных запросов для получения информации о времени ответа сотрудников:

Время до первого группового ответа для тем, созданных в определённый период времени

Возвращает время до первого ответа члена определённой группы на «обычные» (не личные сообщения) темы, созданные пользователем, который не является членом этой группы. Параметр :group_name запроса по умолчанию установлен в значение «staff». При этом значении он покажет время до первого ответа сотрудниками. Вы можете изменить значение этого параметра, чтобы получить время ответа для разных групп. Например, «customer_support».

Обратите внимание, что даты технически должны предоставляться в формате yyyy-mm-dd, но запрос также принимает даты в формате dd-mm-yyyy.

-- [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(MINUTE FROM (p.created_at - t.created_at)) 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,
    response_time_minutes
FROM group_response_times
WHERE row_num = 1
ORDER BY category_id, response_time_minutes

Среднее время до первого группового ответа по категориям:

Использует ту же логику, что и предыдущий запрос, но возвращает среднее время до первого ответа членами указанной группы по каждой категории для тем, созданных пользователями, не являющимися членами этой группы, в период времени, заданный параметрами :start_date и :end_date. Как и в предыдущем запросе, если параметр :group_name оставить со значением по умолчанию «staff», он вернёт среднее время первого ответа сотрудниками для обычных тем, созданных пользователями, не являющимися сотрудниками.

-- [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(MINUTE FROM (p.created_at - t.created_at)) 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,
    AVG (response_time_minutes) AS average_response_time_minutes,
    COUNT(*) AS num_topics_with_staff_responses
FROM group_response_times
WHERE row_num = 1
GROUP BY category_id

@JammyDodger, возможно, стоит заменить запрос в исходном сообщении на последние два запроса в этом посте. Также, вероятно, стоит обновить заголовок на что-то вроде «Время до первого ответа членами группы».