Sql 分组随机抽样
我有一个代码,我需要从这个超过60000人的名单中随机抽取400名员工。有8个不同的工作分组,我需要从每个分组的一定数量。因此,在总共400个随机样本中,我需要400个样本由8组中每一组的特定数字组成。这是迄今为止的代码: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
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