首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL计算阈值查询

PostgreSQL计算阈值查询
EN

Stack Overflow用户
提问于 2016-04-18 16:22:37
回答 3查看 1.4K关注 0票数 3

我有一个带有表t1的postgresql,我想要计算一个阈值。例如,汽车1的耗油量超过所有汽车的75 %,car2使用的燃料超过所有汽车的50%,.数学上,我明白我想做什么,但我不知道如何构建查询

代码语言:javascript
运行
复制
id | name | value | threshold
________________________

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

下面是一个sql花式http://sqlfiddle.com/#!15/1e914/1

代码语言:javascript
运行
复制
UPDATE t1
SET threshold = 
    select count(value)
     from t1

其中(值>在每一行上),后面跟着*100/总计数()

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-18 16:58:27

您可以通过一个窗口函数很好地解决这个问题。

代码语言:javascript
运行
复制
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(*)那样聚合行。

票数 5
EN

Stack Overflow用户

发布于 2016-04-18 22:42:40

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-04-18 16:51:44

你想计算使用燃料的百分比吗?

代码语言:javascript
运行
复制
UPDATE t1 
SET threshold = 
    (select value * 100 / t2.sumValue
    from (select sum(value) sumValue from t1) t2
    )

或者,如果您想要计算特定的阈值,可以显示您的预期结果吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36699368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档