组中的随机样本

时间:2013-04-25 19:45:20

标签: sql tsql

我有一个代码,我需要从这个超过60,000的列表中提取400名随机员工。这是8个不同的工作分组,每个分组我需要一定数量的工作分组。因此,在我需要的总共400个随机样本中,400个需要由来自8个组中的每个组的特定数字组成。这是到目前为止的代码:

SELECT TOP (400) Business_Unit, GEMSID, First_Name, Last_Name, Region, District, Job_Function,     Email_Address, Job_Group_Code
FROM  dbo.v_TMS_employee_HR
ORDER BY NEWID()
IE:在返回的400条随机记录中:第1组需要45条,第2组需要50条,第3组需要35条,第4组需要25条,第5组需要100条,第6组需要5条,第7组需要70条第8组需要70。

每组由1-4个不同的工作代码组成。

2 个答案:

答案 0 :(得分:0)

如果只有8个组,您可以使用自己的TOP号码进行8个单独的查询(每个组1个),然后UNION将它们全部放在一起。

这样的事情(您需要为每个组设置正确的记录金额并更正组码):

SELECT * FROM 
(SELECT TOP (100) Business_Unit, GEMSID, First_Name, Last_Name, Region, District, Job_Function,     Email_Address, Job_Group_Code
FROM  dbo.v_TMS_employee_HR
WHERE Job_Group_Code=1 
ORDER BY NEWID())
UNION
...................
UNION
...................
...................
UNION
SELECT * FROM (
SELECT TOP (10) Business_Unit, GEMSID, First_Name, Last_Name, Region, District, Job_Function,     Email_Address, Job_Group_Code
FROM  dbo.v_TMS_employee_HR
WHERE Job_Group_Code=8 
ORDER BY NEWID())

由于您澄清了组中有多个job_group_codes,因此您需要使用WHERE Job_Group_Code IN (1,2,3)

答案 1 :(得分:0)

如果您只有8组,这是一次性的事情,请尝试@PM 77-1建议。但是,我会使用UNION ALL代替UNION

如果您从每个组中选择的更多组或记录数量不同,您可以尝试以下方式

DECLARE @GroupSelect TABLE (Job_Group_Code INT, NumberOfRecord INT)

INSERT INTO @GroupSelect VALUES (1 ,45), (2 ,50)  , ....  -- List all your group and number of records your want select from them

;WITH tbl AS (
SELECT Business_Unit, GEMSID, First_Name, Last_Name, Region, District, Job_Function,     Email_Address, Job_Group_Code
    , ROW_NUMBER() OVER (PARTITION BY Job_Group_Code ORDER BY NEWID()) as RowNo
FROM  dbo.v_TMS_employee_HR
)
, numbers ( 
-- if you don't have number table, you may use this. 
 select number + 1 as number from master..spt_values WHERE type = 'P'
)
SELECT t.* 
from tbl t
INNER JOIN @GroupSelect sg  
    ON sg.Job_Group_Code = t.Job_Group_Code
INNER JOIN numbers n 
    ON sg.NumberOfRecord >= n.number
WHERE n.number = t.RowNo