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
我有带有 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