【发布时间】:2016-08-10 12:13:05
【问题描述】:
我有一个带有表 t1 的 postgresql db,我想计算一个阈值。 例如,阈值应该是汽车 1 使用的燃料比所有汽车的 75% 多,汽车 2 使用的燃料比所有汽车的 50% 多,...。 数学上我明白我想做什么,但我不知道如何构建查询
id | name | value | threshold
________________________
1 | car1 | 30 | ...%
2 | car2 | 15 | ..%
3 | car3 | 7 |
4 | car4 | 5 |
这是一个 sql fiddle http://sqlfiddle.com/#!15/1e914/1
UPDATE t1
SET threshold =
select count(value)
from t1
where (value > [over each row]) 然后是*100/总计数()
很抱歉这次糟糕的尝试,但我有点迷路了。还尝试了一些聚合函数。
【问题讨论】:
-
看看
100 * PERCENT_RANK() OVER (ORDER BY value)或100 * CUME_DIST() OVER (ORDER BY value) -
@dnoeth 这两个都不起作用,因为解决方案是相对于最省油的汽车而言的,而不是针对整个人口计算的。
-
@Patrick:如果这些功能不起作用,那么您的答案也不正确。两者都只是您的
RANK/COUNT的细微变化:-) -
@dnoeth 不正确。我正在使用
(rank() - 1) / count(),它给出了这个问题的准确结果。- 1可能很轻微,但这就是你不能使用内置函数的原因。 -
@Patrick:好的,根据预期结果,两者都不正确,但这只是基于四行的描述 :-) 这就是为什么我写他应该看看这些功能是否符合他的需要。
PERCENT_RANK基于(RANK-1)/(COUNT-1),即小于当前值的行数,CUME_DIST基于小于或等于。
标签: sql postgresql math window-functions threshold