第一次在这里提问,先谢谢了。也是 SQL 的新手,所以这可能是一个基本问题。
我负责我们产品的每周错误报告,并试图提出一个“更智能”的查询,该查询只会返回错误数量代表客户流量的很大一部分的情况(例如,不显示我在客户的 50,000,000 个网站访问者中出现了 100,000 个错误,但在 200,000 个中显示了 50,000 个错误)。
困难之处在于,我想将移动流量与桌面流量区分开来,并在其中任何一个出错率很高(现在假设为 20%)时返回客户的数据。
这是我到目前为止所拥有的:
WITH requests_summary AS (
SELECT customer_id, column_x, column_y, column_z
SUM(CASE WHEN event = 'error' AND device = 'mobile' THEN 1 ELSE 0 END) AS err_mbl,
SUM(CASE WHEN event = 'traffic' AND device = 'mobile' THEN 1 ELSE 0 END) AS trf_mbl
SUM(CASE WHEN event = 'error' AND device = 'desktop' THEN 1 ELSE 0 END) AS err_desk,
SUM(CASE WHEN event = 'traffic' AND device = 'desktop' THEN 1 ELSE 0 END) AS trf_desk
FROM "table"
WHERE timestamp >= DATEADD(day,-1, GETDATE())
GROUP BY 1,2,3,4
)
SELECT *
FROM requests_summary
WHERE 1.0 * err_mbl / trf_mbl > 0.2
OR 1.0 * err_desk / trf_desk > 0.2;
现在的问题是,每次运行此查询时都会出现“除以零”错误。到目前为止,我已经:
- 一次注释掉桌面和移动分区条件,以验证它们都给出了错误
- 尝试对 CASE 子句进行单独查询,一次一个,以验证每个平台上的流量不为零(无论如何,一整天都没有流量是不可能的)
- 将 trf_mbl 和 trf_desk 分母替换为 (A) 任意非零数和 (B) COUNT(*),两者都使查询工作
所以我认为问题在于我使用 WITH 子句创建临时 requests_summary 表,但我仍然不确定如何解决这个问题。在过去的两天里,我一直在修补这个问题,但仍然没有成功。任何人都可以提供指导吗?