Postgresql 非全日制研究生的成本计算

Postgresql 非全日制研究生的成本计算,postgresql,percentile,Postgresql,Percentile,我有一个查询,其中我试图获取与每个id的第99个%ile数据相关联的最大成本。我首先计算所有存储桶,然后尝试筛选出特定%ile的最大值。这适用于在where子句中指定百分比,但不适用于having。(我不知道我的数据是否每个ID都有100个尼特)有人能建议解决这个问题吗 select distinct t1.id, max(t1.cost) over (partition by t1.id) as n99_percentile from( select id, cos

我有一个查询,其中我试图获取与每个id的第99个%ile数据相关联的最大成本。我首先计算所有存储桶,然后尝试筛选出特定%ile的最大值。这适用于在where子句中指定百分比,但不适用于having。(我不知道我的数据是否每个ID都有100个尼特)有人能建议解决这个问题吗

select distinct t1.id,
       max(t1.cost) over (partition by t1.id) as n99_percentile
from( select id, 
      cost,
      ntile(100) over (partition by id, order by cost) as percentile_bucket
     ) t1
group by t1.id, t1.cost, t1.percentile_bucket
having percentile_bucket = max(percentile_bucket) -1;

谢谢大家!

如果我正确理解你的问题,你想按“id”划分,然后得到“cost”的值,该值位于如果我正确理解你的问题,你想按“id”划分,然后得到“cost”的值,该值位于这有点复杂。有一种更简单的方法。你想要的是所谓的“有序集”。让我展示一个包括一些数据的示例:

test=# CREATE TABLE t_oil (country text, year int, production int);
CREATE TABLE
test=# COPY t_oil FROM PROGRAM 'curl www.cybertec.at/secret/oil.txt';
COPY 92
这是一组微不足道的数据。让我们假设我们想要找到每个国家的价值,这些价值超过所有数据的90%。那么:我要实现什么才能打败90%?这里要做的是percentile_disc(=离散;一个数字,实际上在数据中)或percentile_cont(“连续”,在没有精确匹配的情况下可能是一个插值)

查询的工作方式如下:

test=# SELECT   country, 
        percentile_cont(0.9) WITHIN GROUP (ORDER BY production),
        percentile_disc(0.9) WITHIN GROUP (ORDER BY production) 
FROM    t_oil 
GROUP BY 1;
    country    | percentile_cont | percentile_disc 
---------------+-----------------+-----------------
 Saudi Arabien |         10359.5 |           10449
 USA           |           10714 |           10828
(2 rows)
团队内部:击败90%所需的价值是多少?当然,你需要团队内部的秩序。否则就不行了。
如果我正确理解您的请求,这似乎就是您要找的。

这有点复杂。有一种更简单的方法。你想要的是所谓的“有序集”。让我展示一个包括一些数据的示例:

test=# CREATE TABLE t_oil (country text, year int, production int);
CREATE TABLE
test=# COPY t_oil FROM PROGRAM 'curl www.cybertec.at/secret/oil.txt';
COPY 92
这是一组微不足道的数据。让我们假设我们想要找到每个国家的价值,这些价值超过所有数据的90%。那么:我要实现什么才能打败90%?这里要做的是percentile_disc(=离散;一个数字,实际上在数据中)或percentile_cont(“连续”,在没有精确匹配的情况下可能是一个插值)

查询的工作方式如下:

test=# SELECT   country, 
        percentile_cont(0.9) WITHIN GROUP (ORDER BY production),
        percentile_disc(0.9) WITHIN GROUP (ORDER BY production) 
FROM    t_oil 
GROUP BY 1;
    country    | percentile_cont | percentile_disc 
---------------+-----------------+-----------------
 Saudi Arabien |         10359.5 |           10449
 USA           |           10714 |           10828
(2 rows)
团队内部:击败90%所需的价值是多少?当然,你需要团队内部的秩序。否则就不行了。
如果我正确理解您的要求,这似乎就是您要找的。

太棒了!非常感谢。。我花了不少时间在这上面。太棒了!非常感谢。。我花了不少时间在这上面。