近期有道友咨询关于基于成绩评级的问题,这个问题还是比较常见的,比如学生的成绩,比如公司里的评优等等。
最初的问题为:
基于一组随机排序的平均分,前两名评级为A,后三名评级为C,其它为B
按照常规理解
1、先将平均分整体排一序
2、然后基于序号打上标签
这种方式需要通过LARGE()或 SMALL()函数 建立一个有序的辅助子表单
梳理后方式为
IF(明细.平均分>LARGE(SPLIT(平均分集,","),3),"A",IF(明细.平均分<SMALL(SPLIT(平均分集,","),4),"C","B"))
LARGE(SPLIT(平均分集,","),3) 中的“3”代表,找到在平均分集中第3个最大值,即前2个最大值;
SMALL(SPLIT(平均分集,","),4) 中的“4”代表,找到在平均分集中第4个最小值,即后3个最小值。
这种方式,只需要建立一个辅助的主字段,如果,评级需求有变化,进行对应的调整即可。
后续的问题为:
基于一组随机排序的平均分,前两名评级为A,后三名评级为C,其它为B
如果平均分一样,则以数学成绩为参考
最直接的想法
最初看到时,最直接的想法是,直接在原有的公式里嵌套一下不就可以了吗?
然而非也,所有的数据是无序的,你不知道那个相同的平均分是在第几行;
那么针对这个辅助字段再建立一个辅助的子表单可否?
有可能有可以,那么问题来了,如果再加一个维度呢?
继续堆子表单,继续嵌套公式吗?
那么如何来解决?
通过“云函数”或“自建插件”比较容易,嵌套一下循环即可;
单纯的通过“简道云”,通过公式能不能解决?
在PASS了N个想法后,在大脑放空间,突然在想:何不这么干?
把两个维度变成一个维度,把多个维度变成一个维度,问题不就简单了!
平均分为86.5 数学为 98 可以 看作是 865980( 应修订为:08650980 )
平均分的优先级依然是第一位,后面的数字不会对它造成影响,
平均分一样的时候,则后面的作用就会体现出来;
后面如果需要其它维度,直接拼接上去即可。
这样一来,问题就变成了最初始的状态,一个维度的评级,直接用之前的公式即可。
测试链接
测试链接 : https://tnvew1vqtq.jiandaoyun.com/f/63f61d1310107d00086e7fc5
本次思考
1、解决问题的路径有很多,没有说哪个更好,只是哪个更为合适;
2、白毛黑猫抓住老鼠的就是好猫,不要担心,自己的处理方式复杂,总比没有结果更好;
3、行不通时,不妨跳出来,不要被以往的逻辑框住,大胆设想,细心求证。
更多内容:
更多沟通交流可添加微信(zmlnow)
添加时请备注:简道云
|