假设表 t_pay 中有一个字段为 amount,int 类型;现在需要从表中随机捞取一批记录,满足 2000>sum(amount)>10000,请问有没有什么好的方法
1
fuyufjh 2020-09-11 10:46:15 +08:00
是性能关键的场景吗?
是 --> 用 stored procedure 把结果写到临时表,然后一次 select 读取 不是 --> 每次 select limit 100,不够就再来一批 |
2
qmaker OP 条件更正 2000>sum(amount)>10000 =》 20000>sum(amount)>10000
|
3
qmaker OP @fuyufjh 对实时性要求比较高,其实是有多个需求池,比如池 A 要求 sum(amount)≈10000,池 B 要求 sum(amount)≈80000,目前想到的办法是单个记录处理,每条记录取出后丢到某个池里,池蓄满了就接着续下个池,不过单个处理效率感觉还是比较低
|
4
taogen 2020-09-11 11:09:26 +08:00 via iPhone
1. 重复地随机取一批值,可以一次随机取 1 条或者 N 条,放入 list 中。直到 sum 满足条件或者 sum 大了。
2. 若 sum 满足条件,直接返回。若 sum 大了,使用动态规划找到满足条件的子段和。 3. 若动态规划找到有效解返回。若找不到有效解,清空 list,跳转到第 1 步。 |
5
taogen 2020-09-11 11:14:34 +08:00 via iPhone
你这个需求不一定有解,可能出现死循环。可以设置最大寻找次数,超过限制次数视为无解,提示暂无数据。
|
6
kkeiko 2020-09-11 11:36:23 +08:00
写入数据库的时候,把这个字段作为排序值,其他字段打包 json 写入 redis 的有序集合,redis key 根据一定的业务规则进行 hash,多分一些 key,每次从不同的 key 取出在此范围内的数据,多取一些,再合并,根据某个条件排个序,取前几位,做相对随机的效果。
|
7
rockyou12 2020-09-11 11:39:33 +08:00
先开张表记录下单条值的区间分布,然后去拿各个区间内对应的值?
|