【问题标题】:How to sample data from table object in oracleoracle如何从表对象中采样数据
【发布时间】:2020-03-17 10:01:44
【问题描述】:

我正在尝试创建一个可以传递sampling 参数的过程,我尝试了很多方法都失败了......

create or replace PROCEDURE proc_sampling (
    v_sample     NUMBER
) AS

BEGIN

    -- USE SAMPLE PARAMETER (v_sample) TO SAMPLE THE BELOW SUB-QUERY
    FOR i IN (
        SELECT DISTINCT
           *
        FROM
            t1,
            t2,
            t3
        WHERE
            t1.id=t2.id
            and t2.fid=t3.fid

    ) LOOP



        BEGIN
            INSERT INTO mytable (
               x,y,z
            ) VALUES (
               v1,v2,v3
            );

        EXCEPTION
            WHEN OTHERS THEN
                NULL;
        END;

    END LOOP;

    COMMIT;
END;

【问题讨论】:

  • 你希望从这个过程中得到什么输出。请仅针对您的要求,因为可能有一些简单的解决方案可用。
  • 我只需要传递一个值作为过程内的sampling参数,我会解释更多
  • SELECT * FROM TABLE ( rs ) where rownum<=20 试试这个!!
  • @Tejash 实际上我想使用示例,因为它会改变结果以更好地代表我的情况
  • 您的更新似乎与您发布的第一个问题完全不同。但是你的要求还不清楚。我认为您想使用v_sample 参数限制插入mytable 的行数。您还有其他标准(例如随机性)吗?

标签: sql oracle plsql oracle11g


【解决方案1】:

From the docs:

您可以在对基表的查询中指定 SAMPLE 子句,即 物化视图的容器表,或关键的视图 保存。您不能在非关键视图上指定此子句 保存。

因此,表函数既不是基表、物化视图的容器表,也不是键保留视图。

要返回一些随机行,您可以order by dbms_random.value 然后获取前 N 行:

select *
from   table (
  cast (
    multiset (
      select level
      from dual 
      connect by level <= 10
    ) as sys.odcivarchar2list
  )
)
order  by dbms_random.value
fetch first 3 rows only;

COLUMN_VALUE   
6               
2               
10    

请注意,这必须对整个数据集进行排序。如果这很大,可能需要一段时间!

【讨论】:

    【解决方案2】:

    我认为您可以使用以下代码,该代码使用 oracle 的 DBMS_RANDOM 包。

    CREATE OR REPLACE PROCEDURE PROC_SAMPLING (
        V_SAMPLE NUMBER
    ) AS
    BEGIN
        -- USE SAMPLE PARAMETER (v_sample) TO SAMPLE THE BELOW SUB-QUERY
        BEGIN
            INSERT INTO MYTABLE (X, Y, Z)
                SELECT
                    <your_related_cols>
                FROM
                    (
                        SELECT DISTINCT
                            <your_related_cols>,
                            ROW_NUMBER() OVER(ORDER BY DBMS_RANDOM.VALUE()) AS RN
                        FROM
                            T1 JOIN T2 ON T1.ID = T2.ID
                            JOIN T3 ON T2.FID = T3.FID
                    )
                WHERE RN <= 20;
        EXCEPTION
            WHEN OTHERS THEN
                NULL;
        END;
    COMMIT;
    END;
    /
    

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多