最初の試みはリーダーボードでしたが、純粋な量(「まだ修正されましたか?まだ修正されましたか?まだ修正されましたか?こんにちは?」のようなもの)を、質よりも重視しているようです。確かに、「質」はアルゴリズム化するのが難しいですが、(リーダーボードの投稿を抑制する、自分のトピックへの投稿に感謝する/282822)には明らかな調整の余地があります。
真に役立つユーザーを特定するために、私たちは次のようなことを始めています。
他のユーザーが最初に回答したスレッドを探す
-- 目標:OP以外の最初の返信がSonarSourcerではないトピックを見つける
WITH
SonarSourcers AS (
SELECT u.id AS user_id
FROM groups g
INNER JOIN group_users gu ON g.id=gu.group_id
INNER JOIN users u ON u.id = gu.user_id
WHERE g.name='sonarsourcers'
),
Tagged_topics AS (
SELECT tt.topic_id
FROM topic_tags tt
JOIN tags t on t.id=tt.tag_id
WHERE name = 'me-too'
)
-- 通常のユーザーが作成した「通常の」トピックを見つける
topic_user AS (
SELECT id as topic_id, user_id, created_at
FROM topics
LEFT JOIN SonarSourcers ss USING(user_id)
LEFT JOIN tagged_topics tt on topics.id = tt.topic_id
WHERE ss.user_id IS NULL -- SonarSourcersが開始したトピックを除外
AND tt.topic_id IS NULL -- me-tooタグが付いたトピックを除外
AND user_id > 0 -- DiscoBotの「ようこそ」PM/チュートリアルスレッドを除外
AND visible = TRUE
AND archived = FALSE
AND archetype='regular'
AND created_at::DATE > '2023-07-01'
),
-- ユーザーのトピックに対する最初のOP以外の返信を見つける
min_response AS (
SELECT p.topic_id, tu.created_at, MIN(post_number) as post_number
FROM posts p
JOIN topic_user tu USING(topic_id)
WHERE p.post_type = 1
AND p.user_id != tu.user_id
AND p.post_number > 1
AND p.hidden = false
AND p.deleted_at IS NULL
GROUP BY topic_id, tu.created_at
)
SELECT p.topic_id, p.user_id, mr.created_at::DATE as thread_date
FROM posts p
JOIN min_response mr ON p.topic_id = mr.topic_id AND p.post_number=mr.post_number
LEFT JOIN SonarSourcers ss ON p.user_id=ss.user_id
LEFT JOIN user_badges ub on p.id = ub.post_id and ub.badge_id=110
WHERE ss.user_id IS NULL -- SonarSourcerが最初に返信したトピックを除外
AND ub.user_id IS NULL -- すでにバッジが付与されているトピックを除外
ORDER BY mr.created_at DESC
これらのスレッドを特定したら、ユーザーの返信を評価し、応答したユーザーに「ユーザーヘルプユーザー」バッジを授与するか、スレッドに(スタッフ以外には見えない)「me-too」タグを付けます。(ちなみに、このユーザー応答レポートは、クラウドサービスのインシデントを迅速に発見するという嬉しい副作用もあります。
)
そこから、役立つユーザーをさらに報酬し(ブロンズバッジ5個につきシルバーバッジ1個/283284)、さらに育成するために特定することが容易になります。