简化SQL计算之字母分段
2015-09-22 08:37
274 查看
表rbd_dtl的RBP_VALUE字段存储着字符串“ALL”和一些字母,现在要将该字段拼成分段的字符串,形如: A-F,H,J-K,N-O,Q-S,U-V,X-Z
源数据如下:
具体规则是:
如果RBP_VALUE=“ALL”,则舍去该值。
如果RBP_VALUE前后都是连续的字母,则取第一个字母和最后一个字母作为一段,中间用横杠,比如“A-F”。
如果RBP_VALUE出现间隔,比如K和N之间缺少L和M,则K之前作为一段,N之后作为一段,两段之间用逗号分隔,形如:“J-K,N-O”。
如果RBP_VALUE前后都不连续,比如H前面缺少G,后面缺少I,则当前值单独作为一段。
集算器解法:
A1:执行SQL。
A2:将A1的RGB_VALUE按照字母表对齐,部分结果如下:
A3:对A2进行分组,RBD_VALUE等于null时分一组,不等于null时再分一组。@o表示归并式分组,只对前后数据进行比较。结果如下:
A4:选出非空的组。
A5:根据组内成员个数拼凑字符串。~.m(-1)表示取当前组的最后一条记录。计算结果如下:
A6:用逗号合并集合成员,即:A-F,H,J-K,N-O,Q-S,U-V,X-Z
事实上只需要取出RBD_VALUE就可以了,代码也可以合并为一句:
myDB1.query(“select RBD_VALUE from rbd_dtl”).(RBD_VALUE).align(26.(char(64+~))).group@o(!~).select(~(1)).(~(1)+if(~.len()>1,”-”+~.m(-1))).string@d() 。
源数据如下:
具体规则是:
如果RBP_VALUE=“ALL”,则舍去该值。
如果RBP_VALUE前后都是连续的字母,则取第一个字母和最后一个字母作为一段,中间用横杠,比如“A-F”。
如果RBP_VALUE出现间隔,比如K和N之间缺少L和M,则K之前作为一段,N之后作为一段,两段之间用逗号分隔,形如:“J-K,N-O”。
如果RBP_VALUE前后都不连续,比如H前面缺少G,后面缺少I,则当前值单独作为一段。
集算器解法:
A1:执行SQL。
A2:将A1的RGB_VALUE按照字母表对齐,部分结果如下:
A3:对A2进行分组,RBD_VALUE等于null时分一组,不等于null时再分一组。@o表示归并式分组,只对前后数据进行比较。结果如下:
A4:选出非空的组。
A5:根据组内成员个数拼凑字符串。~.m(-1)表示取当前组的最后一条记录。计算结果如下:
A6:用逗号合并集合成员,即:A-F,H,J-K,N-O,Q-S,U-V,X-Z
事实上只需要取出RBD_VALUE就可以了,代码也可以合并为一句:
myDB1.query(“select RBD_VALUE from rbd_dtl”).(RBD_VALUE).align(26.(char(64+~))).group@o(!~).select(~(1)).(~(1)+if(~.len()>1,”-”+~.m(-1))).string@d() 。
相关文章推荐
- SQL server 2008卸载安装
- mysql数据库研究系列-3
- check_mysql_health
- Oracle热备步骤
- [开发日志]SQL2008删除大量数据
- vc2010下mongodb驱动的编译与环境搭建
- 使用SQL Server CONVERT() 函数
- oracle数据导入不成功
- SQLite在多线程环境下的应用
- MySQL实现嵌套集合模型
- 将xml文件作为一个小的数据库,进行学生的增删改查
- MySql数据库对象
- MySQL5.6安装图解(windows7/8_64位)
- ORACLE随机数DBMS_RANDOM包
- Oracle SQL Developer显示的时间包含时分秒的设置方法
- Windows下php_memcached编译
- spring 的 RedisTemplate解决Serializer
- MySQL存储过程详解 mysql 存储过程
- mysql 过滤查询(以字母开头,以数字开头,非数字开头,非字母开头)
- mysql select相关基础知识