PostgreSQL 计算阈值查询

PostgreSQL calculate threshold query

我有带有 table t1 的 postgresql 数据库,我想计算一个阈值。 阈值应该是例如汽车 1 使用的燃料超过所有汽车的 75%,汽车 2 使用的燃料超过所有汽车的 50%,.... 数学上我明白我想做什么,但我不知道如何构建查询

id | name | value | threshold
________________________

1  | car1 |  30   |  ...%
2  | car2 |  15   |  ..%
3  | car3 |   7   |
4  | car4 |   5   |

这里有一个sqlfiddle http://sqlfiddle.com/#!15/1e914/1

UPDATE t1
SET threshold = 
    select count(value)
     from t1

其中(值 > [每行]) 然后是*100/总计数()

抱歉,我的尝试很糟糕,但我有点迷路了。还尝试了一些聚合函数。

您要计算使用燃料的百分比吗?

UPDATE t1 
SET threshold = 
    (select value * 100 / t2.sumValue
    from (select sum(value) sumValue from t1) t2
    )

或者如果你想计算具体的阈值,你可以显示你的预期结果吗?

你可以用 window function:

来优雅地解决这个问题
UPDATE t1
SET threshold = sub.thr
FROM (
  SELECT id, 100. * (rank() OVER (ORDER BY value) - 1) / count(*) OVER () AS thr
  FROM t1) sub
WHERE t1.id = sub.id;

rank() 函数给出有序集合中的排名(从 1 开始),在本例中为 value 列,然后除以集合中的总行数.请注意,count(*) OVER () 计算第 分区 中的总行数,但它不会像常规 count(*) 那样聚合行。

WITH    q AS
        (
        SELECT  *,
                (RANK() OVER (ORDER BY value) - 1) * 100. / COUNT(*) OVER () nt
        FROM mytable
        )
UPDATE  mytable
SET     threshold = nt
FROM    q
WHERE   mytable.id = q.id