首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何基于加权基值生成样本数据

如何基于加权基值生成样本数据
EN

Stack Overflow用户
提问于 2019-05-30 23:54:01
回答 2查看 210关注 0票数 0

使用SQL,我需要根据一些分配权重的基值生成N行的一些样本数据。

例如:如果我的基值及其相应的权重是:

  • a-1,
  • b-2,
  • c-3,
  • d-4,
  • 电子-5

如果所需的样本大小为15,则返回的行集应该有:

  • 5排e,
  • 四排d,
  • 3行c,
  • 2排b.
  • 和一排

总共15行。

EN

回答 2

Stack Overflow用户

发布于 2019-05-31 00:15:25

在server中,您可以使用left,right来拆分值,然后使用cte + recursion get多个行,这种逻辑对于其他关系数据库管理系统也是常见的。

表& DDL

代码语言:javascript
复制
|val|
|--- |
|a-1|
|b-2|
|c-3|
|d-4|
|e-5|

查询SQL

代码语言:javascript
复制
with cte as (
  select 
   left(val, CHARINDEX('-', val)-1)  id
   ,convert(int, right(val, CHARINDEX('-', val)-1 ))  cnt
  from t
)
,cte2 as (
  select T1.id,T1.cnt - 1 as cnt from cte T1
  union all
  select T1.id,T2.cnt - 1 as cnt from cte T1
  inner join cte2 T2 on T1.id = T2.id and T2.cnt > 0 
)
select id from cte2
order by id,cnt

online demo link | db<>fiddle

票数 0
EN

Stack Overflow用户

发布于 2019-05-31 02:40:30

您需要一种生成行的方法,例如数字表。假设你有,那么问题就是算术(基本上)。

如果行数是权重之和的确切倍数,则以下操作很好:

代码语言:javascript
复制
select *
from (select t.*, sum(weight) over () as sum_weight,
             sum(weight) over (order by rand()) as running_weight
      from t
     ) t join
     n
     on n.n % sum_weight >= running_weight - weight and
        n.n % sum_weight < running_weight
where n.n <= 15
order by value;

这里是db<>fiddle。Fiddle使用Server,但这基本上是标准SQL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56387026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档