【问题标题】:SQL Query / find percentile based on rankSQL查询/根据排名查找百分位数
【发布时间】:2013-08-08 21:34:54
【问题描述】:

我为数据集创建了以下带有排名的表格:

Position  Index IndexL IndexH Amount Rank
1          2.5    2      3     2000   1     
1          2.5    2      3     3000   2
1          2.5    2      3     4000   3
1          2.5    2      3     5000   4
1          2.5    2      3     6000   5

2          1.5    1      2     2500   1     
2          1.5    1      2     4500   2
2          1.5    1      2     6700   3
2          1.5    1      2     8900   4
2          1.5    1      2     9900   5

现在我想根据使用索引创建的排名来查找百分位数,以便得到以下输出:

Position Amount 
1         3000+(4000-3000)*(2.5-2)
2         2500+(4500-2500)*(1.5-1)

有人可以帮我解决这个问题吗?我对 SQL 世界有点陌生。

谢谢, 莫妮卡

【问题讨论】:

  • 我今天看到类似的问题
  • 您是否期望结果中每个不同的 Position 值都有一行?
  • 是的。每个位置将有 1 行

标签: mysql oracle plsql oracle11g plsqldeveloper


【解决方案1】:

我认为你可以使用 percentile_cont() 聚合函数做你想做的事。看起来你想要中位数:

SELECT position,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Amount) as Median
from t
group by position;

您可以阅读更多关于它的信息here

【讨论】:

  • 您好,既然我已经计算了排名,我还需要使用 Percectile_cont。我认为使用排名 2 和 3 并在它们之间插入值应该会给我结果对吗?
  • @Monica 。 . .使用percentile_cont() 可能会更好——如果你能侥幸成功的话。无论如何,您必须进行聚合,每个position 只能获得一行。 (如果想要每一行的中位数,也可以使用percentile_cont()作为解析函数。)
【解决方案2】:

您可以让 Oracle 使用 NTILE 分析函数为您分配一个百分位数:

SELECT
  position,
  amount,
  NTILE(100) OVER (PARTITION BY POSITION ORDER BY amount)
FROM myTable

我不确定结果是否与您的计算相符(我对一些统计数据有些模糊)。如果不是,请尝试@GordonLinoff 提出的PERCENTILE_CONT 解决方案,或者您可以尝试PERCENT_RANK 解析函数 - 只需将上面查询中的NTILE(100) 替换为PERCENT_RANK()

【讨论】:

  • 嗨,我已经使用第一个表中的 row_number 和分区计算了排名。现在,为了获得最终输出,我只需要使用此表中的数据并按所示进行计算 - 就像位置 1 一样,采用排名 2 和 3(IndexL 和 IndexH)的金额并使用比率计算值.
  • 您可以使用LEAD 函数获取以下值:LEAD(Amount) OVER (PARTITION BY Position ORDER BY Rank)。不过,这将为分区中的最后一行返回 null,因此如果您想将其默认为 LEAD(Amount, 1, your-default-value)。恐怕我不明白您的预期输出 - 您想看到 所有内容 还是只是两个示例行?
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多