`
datamachine
  • 浏览: 163532 次
社区版块
存档分类
最新评论

简化SQL计算之分组内的运算

阅读更多

在开发数据库应用时,经常会遇到分组后针对组内数据的运算问题,如:列出近3年每年都发表过论文的学生名单,统计全部参加了历次培训的员工,选出每位客户的高尔夫成绩最高的三天等等。SQL完成这类运算较为复杂,一般需要嵌套多层,导致代码难以理解和维护。而集算器擅长表达这类组内计算,且很容易和JAVA或报表工具集成。下面用一个例子来说明。

 

根据数据库表SaleData统计出2013年中,每个月销售金额均排在前20名的客户名称。SalesData的部分数据如下:


 

想解决这个问题,需要选出2013年的销售数据,然后再按月分组统计,再循环选出每月销售前20名的客户,最后求各组的交集。

用集算器,可以将复杂问题拆分,逐步计算出最终结果。首先,从销售数据中取出2013年的数据,并按月份分组:



 

注:A2中的过滤也可以用SQL来完成。

 

用集算器对数据分组,是真实的分组,会将数据按照需要分为多个组。这和在SQL中的情况是不同的,SQL中的group by命令将直接计算出分组的汇总值,而不能保留分组的中间结果。分组后,A3中的数据如下:



 

在分组前,会自动完成排序,每个分组都是销售记录的集合,如其中3月的数据如下:

 

 

为了统计每个月中,每个客户的月销售总额,需要再按客户分组。在集算器中,只需要循环每个月的数据,分别按客户分组就可以了。循环组内成员时,可以用A.(x)来执行,而不必再去编写循环代码。

A4=A3.(~group(Client))

 

再次分组后,A4中,每个月的数据都是分组的分组



 

此时,3月的数据如下:



 

可以看到,3月数据中的每个分组,都是某个客户的交易数据。

注意上述代码中的“~”表示分组中的每个成员,针对“~”书写的代码就是组内运算代码,比如上面的~.group(Client)

接下里,继续通过组内运算求出每月排名前20的大客户:

A5=A4.(~.top(-sum(Amount);20))

A6=A5.(~.new(Client,sum(Amount):MonthAmount))

 

A5中,循环每个月的数据,计算出了每月销售额最大的前20个客户,并在A6中列出了这些客户的名称及月销售额。A6中计算的结果如下:



 

最后列出分组内的Client字段,并对各分组求交集:

A7=A6.(~.(Client))

A8=A7.isect()

 

A7中求出每月销售额最大的20个客户名称。最后在A8中求12个月的客户名称交集,结果如下:



 

从这个问题中可以看到,集算器可以轻松实现结构化数据的组内计算,可以使得解决问题时的思路更为直观;在组内也能够轻松地完成再分组、排序等计算,使得每一步的数据处理更加清晰自然。此外,集算器能使组成员的循环或者求交集等运算变得更为简易,大大减少代码量。

 

集算器被java程序调用的方法也和普通数据库相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的计算结果,具体方法可参考相关文档。

  • 大小: 70.3 KB
  • 大小: 15.2 KB
  • 大小: 23.5 KB
  • 大小: 69.3 KB
  • 大小: 60.8 KB
  • 大小: 77.1 KB
  • 大小: 82.6 KB
  • 大小: 8.2 KB
0
0
分享到:
评论

相关推荐

    21天迅速学会sql(比较完整的sql学习手册)

    - **背景**:SELECT是最常用的SQL语句之一,用于从数据库中检索特定的数据行或列。 - **一般的语法规则**:SELECT语句的基本格式是“SELECT column_name(s) FROM table_name WHERE condition;”,其中WHERE子句用于...

    基于SQL关系运算的高校排课系统设计.pdf

    文章提出了一种通过关系运算和数据库技术来简化排课问题求解的方法,强调了使用SQL视图和函数对排课对象进行处理的优势。这样的系统设计不仅在排课约束条件的构造、算法效率和排课信息管理方面具有优势,而且具有...

    ORACLE__SQL语句教学

    列的别名是重命名列的一种方法,有助于简化输出或进行复杂的计算。你可以通过在列名后直接跟别名,或使用`AS`关键字来设置别名,如: ```sql SELECT department_id AS dept_id, location_id FROM departments; ``` ...

    SQL 21天学习

    SQL中的表达式允许进行数值、字符串和日期的计算,而条件语句(如CASE语句)则根据不同的条件返回不同的结果。这些功能增强了查询的灵活性和复杂性。 #### 函数:数据处理的利器 SQL提供了丰富的内置函数,如汇总...

    权威SQL 标准规范文档

    4. **集合操作**:SQL支持并集(UNION)、交集(INTERSECT)和差集(EXCEPT)等集合运算,这些运算符允许你组合多个查询的结果。 5. **视图**:视图是虚拟表,它基于一个或多个表的查询结果。在SQL 2008中,你可以...

    21天学SQL-PDF

    《21天学SQL》是一本详尽的指南,旨在帮助初学者到进阶学习者在三周时间内掌握SQL(Structured Query Language)的基础知识及高级技巧。本书通过一系列的章节和练习,逐步引导读者理解并运用SQL语言进行数据库管理、...

    sql中as的一些用法

    - 这里通过`GROUP BY`对`column1`进行分组,并计算每个组内的计数值。 6. **表结构复制**: - `AS`还可以用于复制表结构而不复制数据。 ```sql SELECT * INTO b FROM a WHERE 1 <> 1; ``` - 这个例子中,`b`...

    sql语句的笔试经典考题

    - **简化查询**:通过视图,可以简化复杂的查询语句。 - **安全性**:可以限制用户只能通过视图访问数据,从而提高数据的安全性。 #### 5. SQL语句的关键字 - **SELECT**:用于从数据库中检索数据,是最基本的...

    SQL 速查表.pdf

    SQL中的表别名(alias)和列别名(alias)可以简化SQL语句,并改善其可读性。例如: SELECT s.name, s.age FROM students AS s; 此外,SQL语句中还可以使用事务控制语句(如COMMIT和ROLLBACK)来管理数据的更改。...

    SQL技术手册

    窗口函数则是SQL中的高级特性,它们允许在结果集上进行行间运算,如计算排名或移动平均。 在数据库管理方面,SQL技术手册将解释如何创建视图,这是一种虚拟表,其内容基于一个或多个表的查询结果。视图可以简化复杂...

    sql速成教程

    - **GROUP BY子句:** 将数据分组进行汇总计算。 - **HAVING子句:** 在GROUP BY之后对分组数据应用条件。 - **子句的综合应用:** 结合多个子句构建复杂的查询。 #### 第六天:表的联合 - **在一个SELECT语句中...

    经典SQL例子-scott

    通过深入研究这些例子,你不仅可以熟悉SQL的基本语法,还能了解更高级的特性,如窗口函数、集合运算、连接优化和存储过程等。这将有助于你成为一个熟练的SQL开发者,能够有效地处理和分析大量数据。 "经典SQL例子-...

    21天学通sql

    《21天学通SQL》是一本旨在帮助读者在三周时间内掌握SQL语言核心技能的教程,涵盖了SQL的基础知识、查询技巧、数据操作、表管理以及高级功能等多个方面。以下是对该书各章节知识点的详细解析: ### 第一天:SQL简介...

    sql语句及使用的快速入门

    SQL从最初的版本发展至今,经历了多个版本的迭代,例如SQL-86, SQL-92, SQL-99, SQL-2003, SQL-2008, SQL-2011等,每次迭代都会增加一些新的特性,提高数据库的管理能力。当前,SQL不仅在关系数据库中使用,还用于...

Global site tag (gtag.js) - Google Analytics