Shapiro-Wilk检验

时间:2019-10-18 10:48:42

标签: sql oracle plsql

在PL / SQL中,我想计算所选数据的Shapiro-Wilk值。

显然,函数DBMS_STAT_FUNCS.normal_dist_fit可以执行此操作,但是它将表名作为参数,而不是选择结果。

我使用的值是数字,是在许多内部联接之后选择的。这是我用于典型测试的值的示例(每个值只是一个数字,出于可读性考虑,我在这里仅将它们重新分组):

Container

1 个答案:

答案 0 :(得分:0)

您可以基于查询创建视图。 (“视图”仅表示已命名的查询,其代码被保存以供将来使用;视图不包含任何数据。因此,即使您不想在生产服务器上创建表,也可以创建视图。)您可以在调用拟合优度过程中使用此视图。

首先让我们澄清一下,DBMS_STAT_FUNCS.normal_dist_fit不是一个函数,包名称(和您在帖子中所说的那样)可能是FUNCS所建议的,而是一个过程。实际上,该软件包中的所有子程序都是过程!

该软件包的文档错误

https://docs.oracle.com/database/121/ARPLS/d_stat_f.htm#ARPLS68476

它表示meanstddev IN 参数。他们不是;它们是 OUT 参数。目前尚不清楚为什么在此过程中需要使用它们(有单独的函数来计算它们),但同样,这不是我的选择,而是Oracle的。

这是在物理表上使用normal_dist_fit过程的简短示例(来自另一种模式:标准HR模式)。请注意,我必须具有select any table特权,或某些其他特权才能允许我从HR模式中的表中进行选择。 (我不是以HR的身份登录,而是以其他用户MATHGUY的身份登录。)

declare
  mn number;
  sd number;
  sw number;
begin
  dbms_stat_funcs.normal_dist_fit('HR', 'EMPLOYEES', 'SALARY',
                                  'SHAPIRO_WILKS', mn, sd, sw);
end;
/

W value : .8739562109117848523112862359519603805821

PL/SQL procedure successfully completed.

(请注意,Shapiro-Wilk检验的参数为'SHAPIRO_WILKS',末尾带有 S ;也许Oracle有充分的理由,尽管我对此表示怀疑。)

现在,在我的模式中,我有此查询,该查询会产生一列数字:

select salary * (1 + nvl(commission_pct, 0)) as total_compensation 
from   hr.employees
;

这将计算包括佣金在内的总薪酬(对于拥有一个佣金的员工;需要进行NVL调用,因为对于没有佣金的员工,百分比显示为NULL而不是零)。

我将基于该查询创建一个视图 ...,但我需要具有所需的特权,并且有一点复杂。

到目前为止,我假设我可以从HR模式的表中进行选择;确实,我拥有SELECT ANY TABLE特权。但是,就我而言,我通过角色具有特权。可以选择,但不能基于该SELECT创建视图。要创建视图,我必须获得SELECT ANY TABLE(或一个更弱的授权:从该表中进行专门选择,或者可能进一步限制为仅需要的两列)直接授予我,而不是通过角色。您需要与DBA讨论这件事。这是您已经拥有的特权(否则您现有的SELECT无法使用),但是如果您通过某个角色拥有此特权,那么现在您将需要直接将其授予您。而且,当然,您必须拥有CREATE VIEW特权。

好的,所以假设您具有正确的特权。然后,您可以执行以下操作:

创建视图

create or replace view my_emp(total_comp) 
as 
    select salary*(1 + nvl(commission_pct, 0)) from hr.employees;

调用过程

declare
  mn number;
  sd number;
  sw number;
begin
  dbms_stat_funcs.normal_dist_fit('MATHGUY', 'MY_EMP', 'TOTAL_COMP', 
                                  'SHAPIRO_WILKS', mn, sd, sw);
end;
/

W value : .8852586932906502861798487994791857389177