0

第一次在这里提问,先谢谢了。也是 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 表,但我仍然不确定如何解决这个问题。在过去的两天里,我一直在修补这个问题,但仍然没有成功。任何人都可以提供指导吗?

4

3 回答 3

1

在子查询中使用“有”子句检查 0 流量

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
        having trf_mbl>0 and trf_desk>0
)

SELECT *
FROM requests_summary
WHERE 1.0 * err_mbl / trf_mbl > 0.2
OR 1.0 * err_desk / trf_desk > 0.2;
于 2021-02-21T20:25:56.550 回答
1

问题在于您要划分值的 where 子句。在你的 where 子句中如果一个或两个trf_mbltrf_desk等于 0,你会得到那个错误,这意味着该组中没有交通事件( customerid ,x,y,z)

因此,如果该组中没有交通事件,则必须更改逻辑。

于 2021-02-21T20:25:09.347 回答
0

我将简单地改写WHERE为:

WHERE 1.0 * err_mbl > 0.2 * trf_mbl OR
      1.0 * err_desk > 0.2 * trf_desk

瞧。没有分工。没有错误。

注意:我猜这1.0 *也不是必需的。

于 2021-02-21T20:56:31.027 回答