如何在LogParser 2.2查询中实现time-taken字段的标准差功能?
如何在LogParser 2.2查询中实现time-taken字段的标准差功能?
嗨,这个问题我之前也折腾过!LogParser 2.2确实没自带标准差函数,但咱们可以靠标准差的数学原理,结合它现有的聚合函数手动实现,完全能满足需求。
标准差的核心计算逻辑其实可以拆解成LogParser能处理的步骤:总体标准差的公式是√[(Σ(xi - μ)²)/N],展开后可以转换成更易计算的形式:√[(Σxi²/N) - (Σxi/N)²]。这里的xi就是每条记录的time-taken值,μ是time-taken的平均值,N是有效记录数。
对应到LogParser的查询,咱们可以用SUM、SUM(SQUARE())、COUNT这几个内置函数来组合计算,直接上示例:
SELECT SQRT( (SUM(SQUARE(time-taken)) / COUNT(time-taken)) - SQUARE(SUM(time-taken) / COUNT(time-taken)) ) AS time_taken_stddev FROM C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log WHERE time-taken IS NOT NULL
咱们来拆解一下这个查询:
SUM(SQUARE(time-taken)):计算所有time-taken值的平方总和SUM(time-taken) / COUNT(time-taken):得到time-taken的平均值,再用SQUARE()取平方- 用平方的平均值减去均值的平方,最后用
SQRT()开平方,就得到了总体标准差
如果需要计算样本标准差(也就是除以N-1而不是N,常用于抽样统计),只需要调整分母部分就行,示例如下:
SELECT SQRT( (SUM(SQUARE(time-taken)) - (SQUARE(SUM(time-taken))/COUNT(time-taken))) / (COUNT(time-taken)-1) ) AS time_taken_sample_stddev FROM C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log WHERE time-taken IS NOT NULL
另外还有两个小提醒:
- 一定要加
WHERE time-taken IS NOT NULL过滤空值,不然会导致计算结果不准确 - 如果需要按维度分组计算(比如按日期、按请求页面),只需要加上
GROUP BY子句就行,比如按日期和页面分组的查询:
SELECT date, cs-uri-stem, SQRT( (SUM(SQUARE(time-taken)) / COUNT(time-taken)) - SQUARE(SUM(time-taken) / COUNT(time-taken)) ) AS time_taken_stddev FROM C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log WHERE time-taken IS NOT NULL GROUP BY date, cs-uri-stem
备注:内容来源于stack exchange,提问作者swobi
相关产品推荐
相关产品推荐

