Нет, не актуален. Честно говоря, я не уверен, как он вообще когда-то работал. Скоро я опубликую обновлённую версию и отмечу вас, чтобы сообщить, что она готова.
Редактирование: @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, возможно, стоит заменить запрос в исходном сообщении на последние два запроса в этом посте. Также, вероятно, стоит обновить заголовок на что-то вроде «Время до первого ответа членами группы».