Sql 分组随机抽样

Sql 分组随机抽样,sql,tsql,Sql,Tsql,我有一个代码,我需要从这个超过60000人的名单中随机抽取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

我有一个代码,我需要从这个超过60000人的名单中随机抽取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条随机记录中:第一组需要45条,第二组需要50条,第三组需要35条,第四组需要25条,第五组需要100条,第六组需要5条,第七组需要70条,第八组需要70条


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

如果只有8个组,您可以有8个单独的查询(每个组1个),其中包含自己的
顶部
编号,然后将它们全部合并在一起

类似于以下内容(您需要为每个组设置正确的记录金额和正确的组码):


由于您澄清了一个组中有多个工作组代码,您需要使用
WHERE job\u group\u code in(1,2,3)

如果您只有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

嗯,为什么不使用ORDER BY RAND()呢NEWID可以很好地选择随机数据,在这400个数据中,每个组需要有一个不同的数字表示。看上面的编辑我看了那篇文章它没有回答我的问题,请看我刚才的编辑什么决定了一个群体?也就是说,哪些记录属于组1、组2等?每个组由1-4个不同的职务代码组成。好的,我会在收到具体数字后尝试一下,谢谢。我真的不认为有必要使用
UNION ALL
,因为不同的查询将产生具有不同
职务组代码
值的结果。@PM77-1,是的,这是同样的结果。然而,出于性能原因,只有在必要时,我才会使用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