ant*_*_ml 6 oracle analytic-functions oracle11g
是否可以使用任何百分位函数的窗口?或者你知道一个可以获得滚动百分位值的工作吗?
移动平均线很容易:
select avg(foo) over (order by foo_date rows
between 20 preceding and 1 preceding) foo_avg_ma
from foo_tab
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何在同一个窗口获得中位数(50%百分位数).
您可以使用PERCENTILE_CONT或PERCENTILE_DISC 函数来查找中位数.
PERCENTILE_CONT是一个逆分布函数,它假设一个连续的分布模型.它采用百分位值和排序规范,并返回一个内插值,该值将根据排序规范落入该百分位数值.在计算中忽略空值.
...
PERCENTILE_DISC是一个逆分布函数,它假定为离散分布模型.它需要百分位值和排序规范,并从集合中返回一个元素.在计算中忽略空值.
...
以下示例计算每个部门的工资中位数:
Run Code Online (Sandbox Code Playgroud)SELECT department_id, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) "Median cont", PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary DESC) "Median disc" FROM employees GROUP BY department_id ORDER BY department_id;
...
PERCENTILE_CONT和PERCENTILE_DISC可能会返回不同的结果.PERCENTILE_CONT在执行线性插值后返回计算结果.PERCENTILE_DISC只返回聚合的值集合中的值.当百分位数值为0.5时,如本例所示,PERCENTILE_CONT返回具有偶数个元素的组的两个中间值的平均值,而PERCENTILE_DISC返回两个中间值中第一个的值.对于具有奇数个元素的聚合组,两个函数都返回中间元素的值.
具有窗口模拟槽的SAMPLE范围自连接
with sample_data as (
select /*+materialize*/ora_hash(owner) as table_key,object_name,
row_number() over (partition by owner order by object_name) as median_order,
row_number() over (partition by owner order by dbms_random.value) as any_window_sort_criteria
from dba_objects
)
select table_key,x.any_window_sort_criteria,x.median_order,
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY y.median_order DESC) as rolling_median,
listagg(to_char(y.median_order), ',' )WITHIN GROUP (ORDER BY y.median_order) as elements
from sample_data x
join sample_data y using (table_key)
where y.any_window_sort_criteria between x.any_window_sort_criteria-3 and x.any_window_sort_criteria+3
group by table_key,x.any_window_sort_criteria,x.median_order
order by table_key, any_window_sort_criteria
/
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
4187 次 |
| 最近记录: |