加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

带有组的SQL随机样本

发布时间:2020-12-12 06:58:12 所属栏目:MsSql教程 来源:网络整理
导读:我有一个大学毕业生数据库,想要提取大约1000条记录的随机数据样本. 我想确保样本代表人口,所以希望包括相同比例的课程,例如 我可以使用以下方法执行此操作: select top 500 id from degree where coursecode = 1 order by newid()unionselect top 300 id fro
我有一个大学毕业生数据库,想要提取大约1000条记录的随机数据样本.

我想确保样本代表人口,所以希望包括相同比例的课程,例如

我可以使用以下方法执行此操作:

select top 500 id from degree where coursecode = 1 order by newid()
union
select top 300 id from degree where coursecode = 2 order by newid()
union
select top 200 id from degree where coursecode = 3 order by newid()

但是我们有数百个课程代码,所以这将耗费时间,我希望能够将这些代码重用于不同的样本大小,并且不特别想要查看查询并对样本大小进行硬编码.

任何帮助将不胜感激

解决方法

你想要一个分层的样本.我建议通过按课程代码对数据进行排序并执行第n个样本来完成此操作.如果您的人口规模很大,这里有一种最有效的方法:
select d.*
from (select d.*,row_number() over (order by coursecode,newid) as seqnum,count(*) over () as cnt
      from degree d
     ) d
where seqnum % (cnt / 500) = 1;

编辑:

您还可以“动态”计算每个组的人口规模:

select d.*
from (select d.*,row_number() over (partition by coursecode order by newid) as seqnum,count(*) over () as cnt,count(*) over (partition by coursecode) as cc_cnt
      from degree d
     ) d
where seqnum < 500 * (cc_cnt * 1.0 / cnt)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读