迭代ORACLE中VARRAY中的列

时间:2018-03-23 21:49:47

标签: sql oracle12c

我的数据库中有一个表中有一个VARRAY。 VARRAY大小为4788

CREATE OR REPLACE TYPE numbers AS VARRAY(4788) of NUMBER;

CREATE TABLE table1
    (
        id                      NUMBER(5)         NOT NULL,
        notes                   VARCHAR2(150),
        person_id               NUMBER(5),
        visit_id                NUMBER(5)         NOT NULL,
        device_id               NUMBER(5),
        vals                    numbers,
        CONSTRAINT PK_table1 PRIMARY KEY (id)
    );

我想知道我如何一次迭代第1列(表中有637行,每行有4788大小的VARRAY。我试图做一些统计数据以获得整个Cohens D的值数据集。 基本上我想说的是......

M_1的计算方法是取1-300行第1列的平均值。 M_2是从行301-337的第1列的平均值计算得出的。然后我们减去M_1 - M_2,然后将该值除以行1-637的第1列的所有值的标准偏差。我想对所有4788列重复此操作。

另外,欢迎提出改进建议。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我的建议是为值创建一个单独的表。所以第一个表变为:

CREATE TABLE table1
    (
        id                      NUMBER(5)         NOT NULL,
        notes                   VARCHAR2(150),
        person_id               NUMBER(5),
        visit_id                NUMBER(5)         NOT NULL,
        device_id               NUMBER(5),
        CONSTRAINT PK_table1 PRIMARY KEY (id)
    );

和第二个(子)表是:

CREATE TABLE table2
    (
        id                      NUMBER            NOT NULL,
        table1_id               NUMBER(5)         NOT NULL,
        value                   NUMBER,
        CONSTRAINT PK_table2 PRIMARY KEY (id),
        CONSTRAINT FK_table2_table1 FOREIGN KEY (table1_id)
          REFERENCES table1 (id)
    );

对于table1中的每一行,您将向表2中插入4788行。

现在,您可以使用Oracle AVG函数计算平均值,如:

select avg(value) 
from   table2
where  table1_id between 1 and 300; -- or however you identify the first 300 rows