集算器替代存储过程实现报表数据源

存储过程是SQL语句和流程控制语句的集合,常用来把一个复杂的计算目标分解为多个简单的计算步骤。虽然以复杂性换来了灵活性,但SQL语句固有的缺点仍然体现在存储过程中,比如:分步不彻底、数据无序、缺乏集合、缺乏引用,之前我们也分析过存储过程作为报表数据源的利弊,可点击这里查看。

集算器解决了存储过程的上述缺陷,降低了对开发人员的技术要求,是存储过程理想的替代工具。

报表例子说明

某电信产品厂商有一张报表,主要目的是分析优势产品的销售额、销量、环比等指标,其中优势产品的定义是”在每个州的销量均在前10名的产品”,数据主要存储在stateSales table,其数据结构如下:

stateSales table中的数据主要是各州各产品的销量等信息,但这些数据难以被报表工具直接使用,因为:

  • 数据尚未整理,存在着state和product相同的多条数据。
  • 算法复杂,优势产品难以计算。

将stateSalestable中的数据经过处理,变得易于被外部使用,这个过程称为“数据准备”。让我们计算这个案例中的”优势产品”,看看存储过程和esProc是如何进行数据准备的。

用存储过程

01  create or replace package salesPkg

02  as

03     type salesCur is ref cursor;

04  end;

05  CREATE OR REPLACE PROCEDURE topPro(io_cursor OUTsalesPkg.salesCur)

06  is

07    varSql varchar2(2000);

08    tb_count integer;

09  BEGIN

10    select count(*) into tb_count from dba_tables where table_name=‘TOPPROTMP‘;

11    if tb_count=0then

12   strCreate:=‘CREATE GLOBAL TEMPORARY TABLE TOPPROTMP (

stateTmp NUMBERnot null,

productTmp varchar2(10)  not null,

amountTmp NUMBER not null

)

ON COMMIT PRESERVE ROWS‘;

13    execute immediate strCreate;

14    endif;

15    execute immediate‘truncate tableTOPPROTMP‘;

16    insert into TOPPROTMP(stateTmp,productTmp,amountTmp)

select state,product,amount from stateSales a

wherenot(

(a.state,a.product) in (

select state,product from stateSales group by state,product having count(*) > 1

)

and rowid not in (

select min(rowid) from stateSales group by state,product having count(*)>1

)

)

orderby state,product;

17    OPEN io_cursor for

18    SELECT productTmp  FROM (

SELECT stateTmp,productTmp,amountTmp,rankorder

FROM (SELECTstateTmp,productTmp,amountTmp,RANK() OVER(PARTITIONBY stateTmp ORDERBY amountTmp DESC) rankorder

FROM TOPPROTMP

)

WHERE rankorder<=10orderby stateTmp

)

GROUPBY productTmp

HAVINGC OUNT(*)=(SELECT COUNT(DISTINCT stateTmp ) FROM TOPPROTMP);

END;

01-04:定义”cursor”

05-09:定义存储过程及变量

10-15:定义”temporary table”,检查是否重复定义,清空临时数据。

16:过滤重复数据,并把过滤后的数据写入”temporary table”。直接取不重复的数据比较困难,这里使用了一个技巧:找到重复数据,然后用not反向取条件,剩下的就是不重复的数据。通过嵌入两个子查询可以实现这个功能。

17:打开cusor,为输出数据做准备。

18:取得各州排名均是前10的产品。首先用窗口函数取得各州内产品的排名rankorder,然后过滤出各州内排名前10的产品,最后取得在各州都是前10的产品。由于SQL没有求交集这样的函数,这里使用了一个技巧:按照产品分组,如果相同产品的数量等于州的数量,则说明这个产品在各州均是前10名。通过三层嵌套查询和一个子查询可以实现这个功能。这里用到了SQL-2003的窗口函数,可以显著降低难度。

存储过程实现这个目标的方法很多,这里是把计算过程拆分成2个清晰的步骤,实际上可以用更多的临时表和更多的SQL语句把计算过程拆分得更细,当然代码量也会更大。

用集算器解答

A1格:取出数据

A2格:过滤掉A1中的重复数据。

A3格:把A2中的数据按state进行分组。

B3格:在A3的每个组(州)里,求出销售额前10的记录序号。

A4格:用序号从A3中取出产品。

A5格:求A4中各组产品的交集。

这里的函数”rank”用来求排名,以amount为比较依据;函数”pselect”用来求记录的序号,条件是排名小于10;函数isect用来求多组数据的交集。

比较

存储过程解决此类问题需要很高的技术能力,只能在难懂的语句和大量的代码之间做选择,前者对SQL技术要求非常高,后者对编程技术要求非常高。另一方面,存储过程推出的主要目的是弥补SQL语句的缺陷,但存储过程仍然是以SQL语句为基础的,难以从根本上改变这些缺陷。

可以看到,集算器解决这个问题是按照直观的业务描述进行的,没有所谓”技巧”之类难懂的语句;每一步的分析都清晰易读,可以逐步推进,轻松实现分析目标。

比其存储过程来,集算器更适合解决类似的复杂计算,这是由集算器的一些特性决定的。

特性:JDBC接口

JDBC是一种应用广泛而且标准规范的接口,常用来被JAVA架构的应用程序调用,达到访问各类数据库的目的。集算器由纯JAVA语言编写而成,对外提供了JDBC接口,集算器将被识别为一个数据库,外部程序(比如报表工具)可以用SQL语句访问集算器。

特性:专业的批量数据计算工具

集算器是专为批量数据计算而生的工具,具备SQL语句和存储过程的分析能力,一方面可以像SQL语句那样对数据进行查询、过滤、分组,统计;另一方面也可像存储过程那样对分析过程进行循环、分支判断。

特性:超越存储过程

同为批量数据计算的工具,SQL语句和存储过程存在着一些明显的缺陷:分步不彻底、集合化不彻底、缺乏序号、缺乏引用。因此遇到复杂计算时,设计SQL语句或存储过程往往会变得异常艰难,对开发人员的技术能力也要求极高。

集算器的分析能力也大大强于存储过程,克服了这些固有缺陷,可以轻松实现复杂的计算,对技术人员的要求也大大降低。

集算器的价值

集算器强大的分析能力,较低的技术要求使开发人员摆脱了复杂难懂的存储过程。

集算器不绑定数据库,支持多数据源,可以方便的进行移植,是高效易维护的开发工具。

集算器专为批量数据计算而打造,是数据计算更好的选择。

集算器替代存储过程实现报表数据源,布布扣,bubuko.com

时间: 2024-12-23 12:52:55

集算器替代存储过程实现报表数据源的相关文章

集算器协助Java处理多样性数据源之Hive

Java使用jdbc连接Hive比较简单,但是Hive的计算能力相对于其它数据库的SQL而言较弱,要完成非常规的计算需要将数据取出后用Java进一步计算,编程比较麻烦. 使用集算器配合Java编程,可以减少Java使用Hive时要进行复杂计算工作量.下面我们通过例子来看一下具体作法:Hive中的orders表中保存了订单的明细数据,需要计算同期比和比上期.数据如下: ORDERID CLIENT SELLERID AMOUNT ORDERDATE    1 UJRNP 17 392 2008/1

集算器如何优化复杂报表计算(2)格式布局及过程计算

布局格式 横向分栏 大多数报表工具都支持纵向分栏,但几乎没有报表工具支持横向分栏,我们可以用集算器把数据集事先摆好. A B C 1 =db.query("select a,b,c from T ") 2 =A1.step(3,1) =A1.step(3,2)|[null] =A1.step(3,3)|[null] 3 =A2.derive(B2(#).a:a2,B2(#).b:b2,B2(#).c:c2,C2(#).a:a3,C2(#).b:b3,C2(#).c:c3) 这段代码将3

集算器协助java处理多样性数据源之HDFS

Java通过Hadoop提供的API访问HDFS不算困难,但针对其上文件的计算就比较麻烦.比如分组.过滤.排序等计算,用java来实现都比较复杂.集算器esproc能很好地协助java解决计算问题,同时也封装了HDFS的访问,借助esproc可以让java加强HDFS上文件的计算能力,结构化半结构化数据计算都可以轻松完成.下面我们通过例子来看一下具体作法. HDFS中的文本文件employee.gz中保存了员工数据.我们要读取员工信息,从中找出1981年1月1日(含)之后出生的女员工.文本文件在

集算器协助java处理多样性数据源之JSON

Java的json开源包一般只能解析json数据,没有运算功能.程序员自己写通用的程序来实现分组.排序.过滤.连接这些计算,相当麻烦.例如:用java写json文件条件过滤程序时,当条件表达式发生变化时就需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 集算器是支持动态表达式的,可以嵌入到Java中写出通用的json计算程序.下面我们通过例子来看一下具体作法.待处理字符串是json格式的员工信息,包含EID.NAME.SURNAME.GE

集算器协助java处理多样性数据源之MongoDB

MongoDB不支持join,其官网上推荐的unity jdbc可以把数据取出来进行二次计算实现join运算,但这些join.group.函数.表达式等高级功能都是收费版才有,而且即使是收费版本,对子查询.窗口函数等复杂SQL运算仍不支持.其他免费的jdbc drive就只能支持最基本的SQL语句了. 用免费的esProc配合MongoDB,可以实现上述结构化(半结构化)复杂计算.这里以join为例说明一下具体作法. MongoDB中的文档orders保存了订单数据,employee保存了员工数

用集算器实现报表的外置存储过程数据源效果

业务逻辑相对复杂的报表开发中,开发人员往往会使用存储过程为报表准备数据.而使用存储过程往往受到编写困难.执行效率低下.数据库操作权限限制等问题,着实让开发人员不爽.如何改进或替代存储过程,成了很多程序员的心心声. 本文通过一个例子说明如何使用集算器实现报表存储过程数据源效果. 报表样式 某网络平台需要监测查看一定周期内的用户状况,需要为运营部门出具日报.周报.月报.年报等报表,每类报表中均包含本期与上期.上上期数据比较,故涉及数据量较大.这里以其日报为例(月报年报只是统计周期不同),报表格式如下

润乾集算报表的集算器数据集部署(I)

润乾集算报表提供了集算器数据集,允许用户使用集算器脚本完成数据的进一步计算和加工,为报表提供数据源支持,从而简化报表开发,提升报表性能. 集算器脚本的编辑需要借助第三方集算编辑器(非报表工具)完成,而后嵌入到报表工具和报表应用中完成报表开发和部署. 下面来看一下集算器数据集的使用和以及报表部署过程. 1.开发环境使用 集算报表使用集算器数据集时,首先需要设置集算器授权信息和配置数据源连接(如果需要从数据库中取数). 1.1.设置授权信息 启动集算报表设计器,选择工具-选项,切换到"集算器选项&q

集算器实现报表中零散的不规则计算

报表中存在的不规则计算往往给报表开发带来很大的困难,使用报表工具往往很难甚至无法直接实现.这里的不规则计算是指报表中存在特殊条件的统计项(计算),如:销售订单金额统计中计算前5名销售金额的合计和占比:学生成绩统计中总成绩排名前10的学生中语数外都超过90分的人数:用户充值统计中充值金额超过充值总额一半的用户数量等. 通过集算器可以很方便完成这类报表的开发,我们通过两个例子来了解一下具体的做法. 1.实例一 1.1 .报表描述 根据员工与订单表统计各销售人员的销售情况,并在报表中计算列出订单总额.

用集算器实现跨行组计算报表

跨行组计算类报表在报表开发中非常常见,如常见的同期比.环比计算.移动平均值计算等.这类报表由于经常要引用其他行列的数据进行相对/绝对位置运算,使得报表工具在实现时并不轻松.功能相对强大的润乾报表需要借助层次坐标和位移坐标,辅以条件表达式和"$"运算符完成,书写和理解都有相当的难度. 其实通过集算器这类报表则非常容易实现,我们来看一个例子.     报表需求:根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比,样式如下: 这里应该注意的是比去年同期是指