我正在尝试实现一个程序来评估一组数字的“中值绝对偏差”(通常通过 GROUP BY 子句获得)。 我想使用它的查询示例是:
select id, mad(values) from mytable group by id;
我将使用聚合函数示例
,但我有点困惑,因为该函数需要在完成所有迭代之前知道所有数字的中位数。 任何有关如何实现此类功能的指示将不胜感激。
Oracle 10g+
:
SELECT MEDIAN(ABS(value - med))
FROM (
SELECT value, MEDIAN(value) OVER() AS med
FROM mytable
)
,或与
GROUP BY
相同:
SELECT id, MEDIAN(ABS(value - med))
FROM (
SELECT id, value, MEDIAN(value) OVER(PARTITION BY id) AS med
FROM mytable
)
GROUP BY
id
SELECT id,
ABS(ROUND(MEDIAN(dur - med))) as stmed
FROM (
SELECT id,
(end - start)*86400 as dur,
MEDIAN((end - start)*86400 ) OVER() AS med
FROM mytable
WHERE STATUS = 'SUCCESS'
)
GROUP BY id;
我使用了@Quassnoi的答案,但必须对其进行调整才能计算经过时间的中值绝对偏差(MAD)。
我查询的表包含运行的进程的实例。开始列和结束列表明进程运行需要多长时间。我想知道某个过程是否花费了太长的时间,或者它是否运行得不够长但仍然成功(误报)。
但是,持续时间不服从正态分布,因此标准差没有给我提供可靠的信息。
下一步是从考虑中删除异常值,以获得更准确的正常运行时间,一旦弄清楚,我将更新此答案。