假设在模式表中插入一系列值,并在月末我想申请这些记录(即2500行=数值)算法:对值降序进行排序(从最小值到最高值)然后找到已排序列的80%值。
在我的示例中,如果每行从1开始增加1,则80%值将是2000行=值(= 2500-2500 * 20/100)。该算法需要在行数不恒定的过程中实现,例如每月可以变化2500到1,000,000
答案 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