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