我有一个查询,我试图获得与每个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;
谢谢!
答案 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)
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%所需的价值是多少?当然你需要在团队内部订购。否则它不会起作用。 如果我理解你的要求,这似乎就是你要找的。 p>