PL / SQL中的80%规则估计值

时间:2011-05-26 13:42:28

标签: oracle plsql

假设在模式表中插入一系列值,并在月末我想申请这些记录(即2500行=数值)算法:对值降序进行排序(从最小值到最高值)然后找到已排序列的80%值。

在我的示例中,如果每行从1开始增加1,则80%值将是2000行=值(= 2500-2500 * 20/100)。该算法需要在行数不恒定的过程中实现,例如每月可以变化2500到1,000,000

2 个答案:

答案 0 :(得分:3)

提示:您可以使用Oracle的累积聚合函数实现此目的。例如,假设您的表格如下所示:

     MY_TABLE
+-----+----------+
| ID  | QUANTITY |
+-----+----------+
|  A  |    1     |
|  B  |    2     |
|  C  |    3     |
|  D  |    4     |
|  E  |    5     |
|  F  |    6     |
|  G  |    7     |
|  H  |    8     |
|  I  |    9     |
|  J  |   10     |
+-----+----------+

在每一行,您可以使用以下方法对到目前为止的数量求和:

SELECT
  id,
  quantity,
  SUM(quantity)
    OVER (ORDER BY quantity ROWS UNBOUNDED PRECEDING)
      AS cumulative_quantity_so_far
FROM
  MY_TABLE

给你:

+-----+----------+----------------------------+
| ID  | QUANTITY | CUMULATIVE_QUANTITY_SO_FAR |
+-----+----------+----------------------------+
|  A  |    1     |              1             |
|  B  |    2     |              3             |
|  C  |    3     |              6             |
|  D  |    4     |             10             |
|  E  |    5     |             15             |
|  F  |    6     |             21             |
|  G  |    7     |             28             |
|  H  |    8     |             36             |
|  I  |    9     |             45             |
|  J  |   10     |             55             |
+-----+----------+----------------------------+

希望这对您的工作有所帮助。

答案 1 :(得分:2)

使用percentile_disc函数编写查询以解决您的问题。听起来它就像你想做的那样。

一个例子是

select percentile_disc(0.8) within group (order by the_value)
from my_table