- 浏览: 163525 次
最新评论
-
mx122723:
不错,学习了!
解决报表特殊布局的若干示例 -
Long_yuan:
说了半天加个字段就好了嘛。。。。。。
MongoDB的本地化排序 -
windlike:
...
查询MongoDB子文档的List字段 -
Long_yuan:
既然用mongodb 还是赶紧丢掉sql设计范式吧
MongoDB的外键关联处理 -
datamachine:
m635674608 写道收费的吧???不是开源的吧??有免费 ...
结构化文本文件之间的集合运算
文章列表
在数据库应用开发中,我们经常需要面对复杂的SQL式计算,比如多层分组中的关联计算。由于SQL分组时必须同时汇总,并且不能进行对象式关联访问,因此处理这类问题会比较复杂,只能用窗口函数嵌套多层的子查询的高级技巧来实现。集算器支持真正的分组,直观的对象式关联访问,解决这类问题更加容易。
分组关联在实际业务中遇到的较多,比如http://forums.bit-tech.net/showthread.php?t=207052。下面以链接中的实际业务为蓝本设计一个更通用的例子,用来说明集算器实现分组关联的具体过程。
计算目标:查询出缺货的DVD分店,即现存的DVD拷贝不到4类的分店。
数据结构: ...
取出各组的前N行数据是较常见的运算,比如:每位员工涨薪最多的一次是哪次;高尔夫成绩最差的三次是哪三次;每个月,每种产品销量最高的五天是哪五天。在SQL中要用窗口函数以及keep/top/rownumber等高级技巧来间接处理,代码难度较大。而且许多数据库(如MySQL)还没有这些高级功能,就只能用复杂的JOIN语句和嵌套的子查询来实现了。如果是多层分组,多级关联,则计算过程会更加复杂。
集算器的top函数可以按行号、最大值、最小值等方式取出分组中的前N行,解决此类问题会更加容易,下面用一个例子来说明。
数据库表golf存储着多位会员的高尔夫得分情况,请取出每位会员成绩最好的三次得分情 ...
固定分组的分组依据不在待分组的数据中,而是来自于外部,比如另一张表、外部参数、条件列表。对于特定类型的固定分组,用SQL实现还算简单,比如:分组依据来自另一张表,且对分组次序没有要求,但要实现其他情况就困难了。
集算器可以轻松解决固定分组中的各类难题,下面用几个例子来说明。
表sales存储着订单记录,其中CLIENT列是客户名,AMOUNT列是订单金额,请将sales按照“潜力客户列表”进行分组,并对各组的AMOUNT列汇总求和。表sales的部分数据如下:
固定排序不是按照某个字段升序或降序排序,而是有着固定的顺序,比如按照2,3,1的顺序排序,或者按照"DSGC","TAS","GC","HU"的顺序来排序。
如果允许在数据库建一张表来存储依据,那就可以用join语句来实现排序。但很多时候排序依据是变动的,或者数据库不能建表,这时就需要先union再join,或者用decode函数。排序依据比较短的时候可以这样做,但排序依据有时候很长,会导致手工书写很长的union字符串和decode字符串,出错率会很高。
我们用例子来了解一下集算器的实现方 ...
在数据库应用开发中,我们经常需要面对复杂的SQL式计算,行间计算就是其中一种,比如用每月的销售额除以上月的销售额,求比上期,或用每月销售额除以去年同月的销售额,求同期比。有些数据库没有提供SQL2003标准的窗口函数(或支持的不完备),完成行间计算就需要更换思路使用连接(join)运算替代,不仅难以理解而且运算效率低下。即使可以使用窗口函数仍要面临嵌套子查询等问题,SQL语句仍较为冗长。而使用集算器可以用更简单直观的代码来实现行间计算,下面用一个例子来说明。
表sales存储着多年的订单数据,请根据该表计算出指定时间段内各月份的销售额比上期和同期比。部分源数据如下:
...
在数据库应用开发中,我们经常需要面对复杂的SQL式计算,行列转置就是其中一种。实现这类算法,Oracle可以使用pivot函数,但其他数据库没有相应的函数,因此代码比较难写,也不易理解和维护。另外,pivot函数只能实现固定列的转置,对于非固定列则无能为力,其他数据库同样无法实现非固定列的转置,通常都要求助于高级语言来实现动态SQL。
用集算器实现此类算法会更加简洁易懂,下面用一个例子来说明。
数据库表SALES存储着订单数据,部分数据如下:
现在要计算出2013年各月份订单的总金额、最大订单金额、最小订单金额,以及总订单数,并将数据转置成13列4
在数据库应用开发中,我们经常需要面对复杂的SQL式计算,行列转置就是其中一种。实现这类算法,Oracle可以使用pivot函数,但其他数据库没有相应的函数,因此代码比较难写,也不易理解和维护。另外,pivot函数只能实现固定列的转置,对于非固定列则无能为力,其他数据库同样无法实现非固定列的转置,通常都要求助于高级语言来实现动态SQL。
用集算器实现此类算法会更加简洁易懂,下面用一个例子来说明。
数据库表SALES存储着订单数据,部分数据如下:
现在要计算出2013年各月份订单的总金额、最大订单金额、最小订单金额,以及总订单数,并将数据转置成13列4
逆分组也是我们经常遇到的一种计算,即将每条记录拆成多条,实现分组汇总的逆运算。SQL可以实现这种算法,但必须转换思路绕个大弯才能实现,代码很复杂,也不易理解。
集算器实现这种逆分组较为容易,代码简单易懂,下面用一个例子来说明。
表packGather记录着多种产品的包裹汇总数据,字段productID是产品编号,字段packing是包裹件数,每个包裹里的产品数量相同,字段quantitiySum是产品总量。部分数据如下:
区间合并是我们经常遇到的一种复杂SQL计算,如进行不重复时间段汇总,或将重叠的时间段合并等计算。由于SQL集合无序,实现时需要采用递归的方式实现,而对于递归函数不足的数据库实现起来则更加困难。除了递归,SQL实现时还要依赖多层子查询嵌套问题,SQL语句过为冗长使得实现和修改起来都很困难。
集算器在实现这类计算时则比较简单,可以通过直观分步的脚本实现区间合并,下面通过一个例子说明。
用户操作记录表Udetail中存储各用户操作明细记录,部分源数据如下:
ID UID ST ET
...
在我们经常处理的复杂SQL计算,常会遇到这种需求:请将分组数据按顺序拼为一列,并将分组和明细标识为不同的类型,如下所示:
此类算法常见于为报表整理数据,SQL缺少有序集合的机制,需要分组和明细分别设置用于排序的计算列,再将分组和明细合并,最后做排序。实现这种算法,SQL往往要用非ansi标准的特殊函数去实现,代码比较难写,也不易理解。如果对多级分组进行拼凑,将更加难以实现。
用集算器实现此类算法时无需计算列,代码简洁易懂,下面用一个例子来说明。
计算目标
在数据库应用开发中,我们经常需要面对复杂的SQL式计算,比如多层分组中的关联计算。由于SQL分组时必须同时汇总,并且不能进行对象式关联访问,因此处理这类问题会比较复杂,只能用窗口函数嵌套多层的子查询的高级技巧来实现。集算器支持真正的分组,直观的对象式关联访问,解决这类问题更加容易。
分组关联在实际业务中遇到的较多,比如http://forums.bit-tech.net/showthread.php?t=207052。下面以链接中的实际业务为蓝本设计一个更通用的例子,用来说明集算器实现分组关联的具体过程。
计算目标:查询出缺货的DVD分店,即现存的DVD拷贝不到4类的分店。
数据结构: ...
在开发数据库应用时,经常会遇到分组后针对组内数据的运算问题,如:列出近3年每年都发表过论文的学生名单,统计全部参加了历次培训的员工,选出每位客户的高尔夫成绩最高的三天等等。SQL完成这类运算较为复杂,一般 ...
在数据库应用开发中,我们经常需要取出最大值(或最小值)对应的记录而不是最大值本身,比如:每位员工涨薪最多的一次是哪次;高尔夫成绩最差的三次是哪三次;每个月,每种产品销量最高的五天是哪五天。由于SQL的max函数只能取出最大值,而不是最大值对应的记录,因此处理起来会比较复杂,只能用窗口函数或嵌套子查询以及keep/top/rownumber等高级技巧来间接处理。如果是多层分组、多级关联,计算过程会更加复杂。
集算器的top函数可以取出最大值对应的记录,解决此类问题会更加容易,下面用一个例子来说明。
数据库表golf存储着多位会员的高尔夫得分情况,请取出每位会员成绩最好的三次得分情况,部分数据 ...
数据库应用开发中,经常会遇到一些比较复杂的SQL式计算,比如记录拆分,将按分隔符分隔的一条记录拆分成多条记录。SQL在实现时由于数据库间的差异,会遇到语法支持不足、嵌套多层等问题。而集算器具有丰富的类库,可以编写直观分步的脚本,完成这类计算要简单许多,下面通过一个例子来看一下集算器的实现方式。
应用程序将用户一次登陆后的所有操作代码按逗号分隔,以一条记录存储到数据库用户操作表user_op中,该表部分数据如下:
LOGTIME USERID OPID
2014/1/3 11:10:12 100001 a,d,h
2014 ...
许多数据库有MERGE语句,可以方便地将两个表归并。但如果需要归并的数据在文本文件中,就无法直接使用数据库的语法了。这时候可以用集算器针对文本文件完成类似MERGE语句的功能。
table1.txt和table2.txt是结构相同但数据不同的文件。现在要根据列逻辑主键A、B用table2更新table1,即主键相同但其他字段不同时更新table1,主键不同时向table1插入数据。
我们假定源数据已经按按逻辑主键排序,并且要求结果集仍保持对主键有序。这样就可以反复地执行这个操作不断地将新数据加入到目标文件中。
源数据如下: