Oracle SQL:如何通过每个组获取随机记录

时间:2016-04-14 16:31:49

标签: sql oracle

我有一张包含100万条记录和670组的表格。我需要为每个组提取特定的样本量。

示例:如果employee1执行了200个任务,那么我必须提取132个样本。员工2执行了300项任务,然后我必须为所有670名员工提取169个样本等等。预期的总样本数量将是每个员工的总样本任务总和。

emp total_task sample_task
1   200        132
2   300        169

注意:我需要每组的原始数据,即来自200 + 300总记录的所有132 + 169个随机样本。

请帮忙。

1 个答案:

答案 0 :(得分:1)

因此,我们首先创建您的样本大小表 - 您只需要样本大小,而不是总大小(这在您的数据中)。

create table sample_size as
select 1 emp, 132 sample_size from dual union all
select 2 emp, 169 sample_size from dual;

我们模拟了一些数据:

create table task as
select 1 emp, rownum task_id from dual connect by level <= 200 union all
select 2 emp, rownum task_id from dual connect by level <= 300 
;

您在您的EMP上划分的分析函数ROW_NUMBER并按随机顺序排序。

考虑仅使用rown mumber小于或等于样本大小的样本。

with smpl as (
select task.EMP, task.TASK_ID,
case when 
  row_number() over (partition by task.EMP order by dbms_random.value) <= 
  sample_size.sample_size  then 'Y' else 'N' end as is_sample
from task left outer join sample_size on task.emp = sample_size.emp
)
select EMP, TASK_ID 
from smpl 
where is_sample = 'Y';