AI 分诊自动化报告的垃圾邮件标记统计

此 SQL 查询提供有关 Discourse AI - AI triage 自动化报告的垃圾邮件标记的统计信息。它计算标记的总数、已批准或拒绝的数量以及相应的百分比。此报告有助于了解自动垃圾邮件检测在您的论坛上的有效性。

-- [params]
-- date :start_date = 2025-01-01
-- date :end_date = 2025-05-30

SELECT 
    COUNT(*) AS total_flags,
    COUNT(*) FILTER (WHERE r.status = 1) AS approved_flags,
    COUNT(*) FILTER (WHERE r.status = 2) AS rejected_flags,
    ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 1) / COUNT(*), 2) AS approved_percentage,
    ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 2) / COUNT(*), 2) AS rejected_percentage
FROM 
    reviewables r
JOIN 
    post_actions pa ON pa.post_id = r.target_id AND r.target_type = 'Post'
WHERE
    pa.post_action_type_id = 8 -- 垃圾邮件的 ID(标记为垃圾邮件并隐藏帖子)
    AND r.created_at BETWEEN :start_date AND :end_date
    AND r.status IN (1, 2) -- 已接受和已拒绝的标记
    AND r.created_by_id = -1 -- 系统用户 ID

SQL 查询说明

  • 参数: :start_date:end_date 参数采用 YYYY-MM-DD 格式,并带有默认值。
  • 连接: 将 reviewables 表与 post_actions 表连接起来,以确保仅计算经过审核流程的垃圾邮件标记。
  • 过滤:
    • post_action_type_id = 8: 仅限于垃圾邮件标记。
    • 使用指定参数的日期范围过滤。
    • status IN (1, 2): 仅包括已解决(已批准或已拒绝)的标记。
    • created_by_id = -1: 仅包括由系统用户(AI 自动分类)创建的标记。
  • 聚合:
    • total_flags: 系统创建的垃圾邮件标记总数。
    • approved_flags: 管理员批准的标记数量(状态 = 1)。
    • rejected_flags: 管理员拒绝的标记数量(状态 = 2)。
    • approved_percentage: 已批准标记的百分比。
    • rejected_percentage: 已拒绝标记的百分比。

示例结果

total_flags approved_flags rejected_flags approved_percentage rejected_percentage
152 128 24 84.21 15.79
3 个赞

我得到了

PG::DivisionByZero: ERROR:  division by zero

发生该错误的原因是在该时间段内,@system 没有标记任何您同意或不同意的垃圾邮件。
查询尝试除以满足条件的总标记数。在您的情况下,该数字为 0,因此会中断。
如果您希望查询仍然返回结果,可以使用 NULLIF 进行检查,这样在没有可除数时您会得到 NULL

-- [params]
-- date :start_date = 2025-01-01
-- date :end_date = 2025-05-30

SELECT 
    COUNT(*) AS total_flags,
    COUNT(*) FILTER (WHERE r.status = 1) AS approved_flags,
    COUNT(*) FILTER (WHERE r.status = 2) AS rejected_flags,
    ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 1) / NULLIF(COUNT(*), 0), 2) AS approved_percentage,
    ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 2) / NULLIF(COUNT(*), 0), 2) AS rejected_percentage
FROM 
    reviewables r
JOIN 
    post_actions pa ON pa.post_id = r.target_id AND r.target_type = 'Post'
WHERE
    pa.post_action_type_id = 8 -- ID for spam (Flag as spam and hide post) (垃圾邮件的 ID(标记为垃圾邮件并隐藏帖子))
    AND r.created_at BETWEEN :start_date AND :end_date
    AND r.status IN (1, 2) -- Accepted and rejected flags (已接受和已拒绝的标记)
    AND r.created_by_id = -1 -- System user ID (系统用户 ID)
2 个赞

我有几个,都是误报,但我记不清我是怎么处理的了。

但类似的事情我也猜到了(我真的很不擅长阅读SQL)。