计算 pen ultimate ntile postgres 的成本

calculating cost for pen ultimate ntile postgres

我有一个查询,我试图为每个 ID 获取与第 99%ile 数据关联的最大成本。我首先计算 ntile 桶,然后尝试过滤出特定 %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' 的值,该值占按相同顺序排序的分区中所有记录的 <=99% 'cost'。如果那确实是你想要的,那么你不需要 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;

这有点复杂。有一种更简单的方法。你想要的是所谓的"ordered set"。让我举一个例子,包括一些数据:

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("continuous"可能是一个插值,以防没有完全匹配) .

查询是这样工作的:

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% 所需的价值是多少?当然,您需要在组内进行排序。否则它不会工作。 如果我正确理解您的要求,这似乎就是您要找的东西。