最近在工程上有碰到这种情况,用sql解决了
在平均分配奖金和分配任务的场景里,比如有一个月目标N,当月有n天,那么对应到每一
天目标值是N/n,考虑到精度,当除不尽的时候,就可能产生当月每日的目标值之和不等
于N,就会带来统计上的问题。类似于微信发红包,如果平分的话,因为精度问题,最后
可能总要剩下几分钱。
这时候可以采用计算N/n的商p和余数q,前q天分配[N/n]+1, 后面的天数分配[N/n],也
可以设置精度scale:s,计算 N*10^s/n的上p和余数,前q天分配([N*10^s]+1)/10^s,后
面天数分配([N*10^s])/10^s
sql如下:
-- 将6月份所有用户的月度目标分配到每天。目标值的精度字段为scale
select
bi.user_id,
if(day(target_date) <= (bi.target_value * power(10, bi.scale))%day(last_day(ta
rget_date)),
round(floor(bi.target_value * power(10, bi.scale) / day(last_day(target_date))
+ 1) /
power(10, bi.scale), bi.scale),
round(floor(bi.target_value * power(10, bi.scale) / day(last_day(target_date))
) /
power(10, bi.scale), bi.scale)) as
daily_target_value
from b_index bi
join sys_date sd on date_format(sd.date, '%Y-%m') = bi.targe_month
where bi.target_month='2023-06';
【 在 qlogic 的大作中提到: 】
: 标 题: 问个数学问题
: 发信站: 水木社区 (Thu Sep 29 10:59:44 2022), 站内
:
: 【 以下文字转载自 PreUnivEdu 讨论区 】
: 发信人: qlogic (戒网了), 信区: PreUnivEdu
: 标 题: 问个数学问题
: 发信站: 水木社区 (Thu Sep 29 10:58:00 2022), 站内
:
: a1,a2...an n个整数,和为S
:
: 要求给出
: 100*a1/S , 100*a2/S..... 100*an/S
: 最接近的整数数组
: b1,b2,...bn
:
: 且b1+b2+..bn=100
:
: 实际上就是精度调整。
:
: 最好是给个函数f(x),而不是 bn=100-b1-b2...
: --
:
: ※ 修改:·qlogic 于 Sep 29 10:59:36 2022 修改本文·[FROM: 221.232.128.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 221.232.128.*]
--
修改:qlogic FROM 221.232.128.*
FROM 119.139.199.*