在PL / SQL中,我想计算所选数据的Shapiro-Wilk值。
显然,函数DBMS_STAT_FUNCS.normal_dist_fit可以执行此操作,但是它将表名作为参数,而不是选择结果。
我使用的值是数字,是在许多内部联接之后选择的。这是我用于典型测试的值的示例(每个值只是一个数字,出于可读性考虑,我在这里仅将它们重新分组):
Container
答案 0 :(得分:0)
您可以基于查询创建视图。 (“视图”仅表示已命名的查询,其代码被保存以供将来使用;视图不包含任何数据。因此,即使您不想在生产服务器上创建表,也可以创建视图。)您可以在调用拟合优度过程中使用此视图。
首先让我们澄清一下,DBMS_STAT_FUNCS.normal_dist_fit
不是一个函数,包名称(和您在帖子中所说的那样)可能是FUNCS所建议的,而是一个过程。实际上,该软件包中的所有子程序都是过程!
该软件包的文档错误。
https://docs.oracle.com/database/121/ARPLS/d_stat_f.htm#ARPLS68476
它表示mean
和stddev
是 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