计算笔最终ntile postgres的成本

时间:2015-08-10 13:47:27

标签: postgresql percentile

我有一个查询,我试图获得与每个id的99%ile数据相关的最大成本。我首先计算ntile桶,然后尝试过滤掉特定%ile的最大值。这适用于在where子句中指定百分位数但不具有。 (我不知道我的数据是否会为每个ids提供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;

谢谢!

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,您希望按照&id;然后得到' cost'这是由相同'成本排序的分区中所有记录的< = 99%。如果这确实是你想要的,那么你不需要ntile()函数,但你可以使用cume_dist()函数:

SELECT DISTINCT id, cost, cume_dist
FROM (
  SELECT id, cost, cume_dist, rank() OVER (PARTITION BY id ORDER BY cume_dist DESC) AS rnk
  FROM (
    SELECT id, cost, cume_dist() OVER (PARTITION BY id ORDER BY cost)
    FROM cum) sub2
  WHERE cume_dist <= 0.99) sub
WHERE rnk = 1
ORDER BY id;

答案 1 :(得分:0)

这有点复杂。有一种更简单的方法。你想要的是一个所谓的&#34;有序集&#34;。让我展示一个包含一些数据的例子:

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(&#34;连续&#34;如果没有完全匹配,它就是一个内插值)。

查询的工作原理如下:

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%所需的价值是多少?当然你需要在团队内部订购。否则它不会起作用。 如果我理解你的要求,这似乎就是你要找的。

相关问题