计算日志表中非200 OK请求的路径占比及SQL语句解析
你的两条SQL解析及需求对齐方案
首先先明确你的核心需求:筛选出所有status != '200 OK'的记录,然后按时间维度分组,计算每个时间下不同路径请求的占比(这里的占比通常有两种常见理解,后面我会分别说明)。
先来看你写的两条SQL:
第一条SQL解析
select time as day, (count(status) * 100 / (select count(*) from log)) as error from log where status != '200 OK' group by day;
这条语句的实际逻辑是:
- 第一步:筛选出所有
status不等于'200 OK'的错误记录 - 第二步:按
time(别名day)分组,统计每个时间点的错误记录总数count(status) - 第三步:用每个时间的错误数 ×100,除以全表所有记录的总数(子查询
select count(*) from log是统计整个表的总请求数,不管状态和时间) - 最终得到的
error字段:是该时间点的错误请求数占全表总请求数的百分比,比如全表一共1000条请求,某天有50条错误,那这个值就是5%。
⚠️ 注意:这条语句既没有按path分组,也没有计算路径相关的占比,和你要的“各路径请求占比”完全不沾边。
第二条SQL解析
select time as day, (count(status) * 100.0 / (select count(*) from log where status != '200OK')) as errors from log where status != '200 OK' group by time order by errors DESC
这条语句有个小笔误:子查询里的status != '200OK'少了空格,和外层的'200 OK'不匹配,会导致子查询统计范围出错,我先假设是'200 OK'来解析:
- 第一步:同样筛选出所有错误记录
- 第二步:按
time分组,统计每个时间点的错误数 - 第三步:用每个时间的错误数 ×100,除以全表所有错误记录的总数(子查询统计的是整个表中所有
status != '200 OK'的记录数) - 最终得到的
errors字段:是该时间点的错误请求数占全表错误总请求数的百分比,比如全表一共200条错误,某天有40条,那这个值就是20%。
⚠️ 同样的问题:这条语句也没有按path分组,完全没涉及到路径的占比计算。
符合你需求的SQL方案
你的需求是“每个时间维度下各路径请求的占比”,通常有两种常见的统计方向,我分别给出对应的SQL:
方向1:每个时间内,某路径的错误请求数占该时间总请求数的比例
(比如:2016-07-01这天总共有100条请求,其中/path-to-page-B/的错误请求有10条,占比10%)
SELECT time AS day, path, COUNT(*) AS error_request_count, -- 计算该路径错误请求占当日总请求的百分比 COUNT(*) * 100.0 / (SELECT COUNT(*) FROM log l2 WHERE l2.time = l1.time) AS error_ratio_of_daily_total FROM log l1 WHERE status != '200 OK' GROUP BY day, path ORDER BY day, error_ratio_of_daily_total DESC;
方向2:每个时间内,某路径的错误请求数占该时间错误请求总数的比例
(比如:2016-07-01这天总共有50条错误请求,其中/path-to-page-B/的错误请求有20条,占比40%)
SELECT time AS day, path, COUNT(*) AS error_request_count, -- 用窗口函数统计当日错误总数,再计算占比 COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (PARTITION BY time) AS error_ratio_of_daily_errors FROM log WHERE status != '200 OK' GROUP BY day, path ORDER BY day, error_ratio_of_daily_errors DESC;
内容的提问来源于stack exchange,提问作者meddy
相关产品推荐
相关产品推荐

