求随机数以及取随机数据行报表中如何做

1739
0

yangqh 数据老手Lv5

发表于2022-10-18 15:41

楼主
场景1:在值域范围内取N个随机数整数
[1..100].select(1=1, asint(M*rand())).distinct().mid(1,N)   //M表示随机数值域范围,N为随机数个数,表达式返回结果为数组格式

示例:
[1..100].select(1=1, asint(500*rand())).distinct().mid(1,2) 表示在0~500中取2个随机整数
表达式解析:
(1)rand()可返回0~1的一个随机数据,所以asint(500*rand())可返回一个0~500的随机整数;[1..100]表示随机数样本个数有100个;
(2).distinct(),将取到的100个样本随机整数去重
(3).mid(1,N)取2个去重后的随机数
相关知识推荐:
数组对象:https://bbs.esensoft.com/thread-133624-1-1.html
数组函数综合应用场景示例:https://bbs.esensoft.com/thread-138767-1-1.html

场景2:数据库表/视图数据,经过过滤筛选后,随机取N条数据
在场景1中,我们已经知道如何取到随机整数,那么如果我们能够知道筛选过滤后有多少条数据,并根据随机行号就能够取到对应的随机行数据了。按照这个思路,我们可以按照以下示例的步骤尝试:
Step1:利用隐藏参数求过滤后数据行;
由于当前需要先进行一些参数过滤,再求总行数,所以可以通过参数行为设置被联动的隐藏参数@sjts,将@sjts赋值为过滤后数据总条数,参数行为:
ardb("select count(*) from (select ROWNUM rn,QC_XL.* from QC_XL) a where BBQ like '"+@bbq+"%'").join(",")
ardb中拼出带过滤的原始sql语句,比如这个示例中是带有@bbq参数过滤;在通过join返回逗号隔开的字符串格式数据;
相关知识推荐:ardb函数常见的几种用法   https://bbs.esensoft.com/thread-133987-1-1.html

Step2:利用sql数据源获取取过滤后随机两条数据(原始过滤sql和前面参数行为的sql保持一致):
sql数据源示例:
select * from
(select ROWNUM rn,QC_XL.* from QC_XL where BBQ like <#="'"+@bbq+"%'"#>) a   //过滤数据并标记行号为rn,注意此处sql过滤需要与Step1中ardb的sql保持一致,以免两处的结果集行数不一致;
where a.rn in <#="("+[1..100].select(1=1, asint(@sjts*rand())).distinct().mid(1,2).join(",")+")"#>  //随机取2个行号的数据行

可以看到宏表达式中实际就是利用场景1的方法,获取两个随机行号。

下面附上示例表样: 分析表_20221018_154024.zip (3.97 KB, 下载次数: )





最近看过此主题的会员

@bert

esen_4XMML46TI9

0个回答

只看楼主

登录后可回答问题,请登录注册

快速回复 返回顶部 返回列表

小时

全天响应

分钟

快速处理问题

工程师强势助力

明星产品
解决方案
联系合作

400咨询:400-0011-866

技术支持QQ:400-0011-866(工作日9:00-18:00)

产品建议邮箱yixin@esensoft.com

关注我们

扫TA学习更多干货

一对一专家交流

版权所有© 2006-2024 北京亿信华辰软件有限责任公司 京ICP备07017321号 京公网安备11010802016281号