【问题标题】:Oracle Analytic Rolling PercentileOracle 分析滚动百分位数
【发布时间】:2012-07-19 22:29:49
【问题描述】:

是否可以将窗口与任何百分位函数一起使用?或者您知道获得滚动百分位值的变通方法吗?

使用移动平均很容易:

select avg(foo) over (order by foo_date rows 
                      between 20 preceding and 1 preceding) foo_avg_ma
from foo_tab

但我不知道如何在同一窗口上获得 中位数(50% 百分位数)。

【问题讨论】:

  • 好问题,但不应该将您的 avg 示例读取 avg(n) over(按 foo_date 前 20 行和 以下 之间的行排序)
  • 不一定。这实现了我想要的,从过去的 20 个值到过去的 1 个值的移动平均值。中位数是问题。我可以通过滞后日期(1 年前和 20 年前)完成移动中位数,然后执行子查询计算日期范围的中位数。但这不是很有效。寻找其他想法。
  • 我明白了,点了。您是否尝试过使用 nth_value(foo,n)?如果您的窗口大小是静态的,这可能是一个想法。

标签: oracle oracle11g analytic-functions


【解决方案1】:

您可以使用PERCENTILE_CONTPERCENTILE_DISC 函数求中位数。

PERCENTILE_CONT 是一个逆分布函数,它假设 连续分布模型。它需要一个百分位值和一个排序 规范,并返回一个内插值,该值将落入 相对于排序规范的百分位值。空值 在计算中被忽略。

...

PERCENTILE_DISC 是一个逆分布函数,它假设 离散分布模型。它需要一个百分位值和一个排序 规范并从集合中返回一个元素。空值被忽略 在计算中。

...

以下示例计算每个部门的工资中位数:

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
/

【讨论】:

  • 那些是正确的函数,除了它们不允许windowing_clause。
  • 错误/不相关的答案。问题明确指出:是否可以将 windowing 与任何百分位函数一起使用?
  • OP 在发表评论之前没有提及任何关于此的内容,并且该功能的官方文档也没有提及任何内容。我个人从来不需要评估滚动中位数,而且我的口袋里并不总是有一个 11g 的预言机来测试人们提出的所有问题。这不是我的错,我只是为了他的目的将 OP 指向了特定的功能。现在我还是编辑了我的答案。
  • 抱歉,我以为您是在暗示这些函数可以与 rows between 语法一起使用。这些功能的文档令人困惑。您必须查看 SQL 语言参考中的“分析函数”页面,向下滚动到底部,然后查找函数名称后跟星号:docs.oracle.com/cd/E11882_01/server.112/e26088/… 不管怎样,+1 以获得解决方案和示例。
猜你喜欢
  • 2022-01-16
  • 2011-11-01
  • 2017-01-02
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多