|
|
1
6
我不能说,如果一个值超过x,就必须消除它。 好吧,您可以使用having和subselect来消除异常值,比如:
(或者,对于这一点,如果您希望能够更好地消除异常值,可以使用更复杂的版本来消除超过2或3个标准差的任何内容。) 另一种选择是考虑生成一个中值,这是一种相当合理的统计方法来计算异常值;令人欣慰的是,有三个合理的例子: one from the Postgresql Wiki ,一 built as an Oracle compatability layer 和另一个来自 PostgreSQL Journal . 请注意有关它们如何精确/准确地实现中间层的注意事项。 |
|
|
2
10
PostgreSQL还可以计算标准差。 您只能获取average()+/-2*stddev()中的数据点,该数据点大致对应于最接近平均值的90%数据点。 当然,2也可以是3(95%)或6(99.995%),但不要挂断数字,因为在有集合异常值的情况下,您不再处理正态分布。 非常小心,并验证它是否按预期工作。 |
|
|
3
2
这是一个聚合函数,它将计算一组值的修剪平均值,不包括平均值n个标准差以外的值。 例子:
代码: DROP TYPE IF EXISTS tmean_stype CASCADE;
CREATE TYPE tmean_stype AS (
deviations FLOAT,
count INT,
acc FLOAT,
acc2 FLOAT,
vals FLOAT[]
);
CREATE OR REPLACE FUNCTION tmean_sfunc(tmean_stype, float, float)
RETURNS tmean_stype AS $$
SELECT $3, $1.count + 1, $1.acc + $2, $1.acc2 + ($2 * $2), array_append($1.vals, $2);
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION tmean_finalfunc(tmean_stype)
RETURNS float AS $$
DECLARE
fcount INT;
facc FLOAT;
mean FLOAT;
stddev FLOAT;
lbound FLOAT;
ubound FLOAT;
val FLOAT;
BEGIN
mean := $1.acc / $1.count;
stddev := sqrt(($1.acc2 / $1.count) - (mean * mean));
lbound := mean - stddev * $1.deviations;
ubound := mean + stddev * $1.deviations;
-- RAISE NOTICE 'mean: % stddev: % lbound: % ubound: %', mean, stddev, lbound, ubound;
fcount := 0;
facc := 0;
FOR i IN array_lower($1.vals, 1) .. array_upper($1.vals, 1) LOOP
val := $1.vals[i];
IF val >= lbound AND val <= ubound THEN
fcount := fcount + 1;
facc := facc + val;
END IF;
END LOOP;
IF fcount = 0 THEN
return NULL;
END IF;
RETURN facc / fcount;
END;
$$ LANGUAGE plpgsql;
CREATE AGGREGATE tmean(float, float)
(
SFUNC = tmean_sfunc,
STYPE = tmean_stype,
FINALFUNC = tmean_finalfunc,
INITCOND = '(-1, 0, 0, 0, {})'
);
要点(应相同): https://gist.github.com/4458294 |
|
|
4
0
介意使用 ntile 窗口功能。它允许您轻松地将极值与结果集隔离开来。
假设您希望从结果集的两边都削减10%。然后将10的值传递给
|
|
|
Johnny T · 基于当前值的SQL合并表[重复] 1 年前 |
|
|
Peter Schofield · 类型转换Postgresql 1 年前 |
|
|
Kevin Smeeks · Pyspark JDBC分区读取 1 年前 |
|
|
Andrus · 如何在sql中查找第二个匹配项 1 年前 |