【问题标题】:Iterating through columns in a VARRAY in ORACLE在 ORACLE 中遍历 VARRAY 中的列
【发布时间】:2018-03-25 18:59:41
【问题描述】:

我的数据库中有一个表,其中有一个 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 行,每行的 VARRAY 大小为 4788。我试图做一些统计数据以从整个数据中获取 Cohens D 的值数据集。 基本上我想说的是……

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 为什么要使用 VARRAY?如果 val 在子表中每行存储 1 个,那么这个计算将是小菜一碟!
  • 嘿@TonyAndrews。感谢那!生病检查它。来自 c++ 背景,我的思绪直接进入了数组。所以,我会在 table1 表中创建一个子表。那么对于 table1 中的每个元组,它都会有一个包含 4788 行的后续子表?
  • @user6315807 。不,这不是托尼的意思。这里的子表是指另一个具有外键关系的数据库表。

标签: sql oracle12c


【解决方案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 中的每一行,您将在 table2 中插入 4788 行。

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

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

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多