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

简化sql计算系列之记录拆分

阅读更多

       数据库应用开发中,经常会遇到一些比较复杂的SQL式计算,比如记录拆分,将按分隔符分隔的一条记录拆分成多条记录。SQL在实现时由于数据库间的差异,会遇到语法支持不足、嵌套多层等问题。而集算器具有丰富的类库,可以编写直观分步的脚本,完成这类计算要简单许多,下面通过一个例子来看一下集算器的实现方式。

 

       应用程序将用户一次登陆后的所有操作代码按逗号分隔,以一条记录存储到数据库用户操作表user_op中,该表部分数据如下:

LOGTIME             USERID OPID

2014/1/3 11:10:12  100001    a,d,h

2014/1/3 9:23:12    100002    a,e,g,p

2014/1/3 10:35:11  100003    a,r,n

      

       现需要将逗号分隔的OPID拆分成多行,如第一条记录拆分后应为:

LOGTIME             USERID OPID

2014/1/3 11:10:12  100001    a

2014/1/3 11:10:12  100001    d

2014/1/3 11:10:12  100001    h

 

       SQL在实现这类运算时需要借助递归查询实现,对于递归查询支持不好的数据库实现起来异常困难,而对递归查询支持不错的Oracle实现也并不简单,比如下面的SQL实现语句:

SELECT logtime,userid,REGEXP_SUBSTR(opid,'[^,]+',1,rn) opid
FROM user_op,(SELECT LEVEL rn FROM DUAL
CONNECT BY LEVEL<=(SELECT MAX(length(trim(translate(opid,replace(opid,','),' '))))+1 FROM user_op))
WHERE REGEXP_SUBSTR(opid,'[^,]+',1,rn) IS NOT NULL

 

或者

select logtime,userid,regexp_substr(opid,'[^,]+',1,level) opid
from user_op
connect by level <= length(opid)-length(regexp_replace(opid,'[^,]+',''))
and rowid= prior rowid
and prior dbms_random.value is not null

       

 

从以上的实现中可以看出SQL实现的复杂性,下面看一下集算器的实现代码:



 

   其中:

       A1=esProc.query("SELECT LOGTIME,USERID,OPID FROM USER_OP")

从数据库中查询user_op表数据,部分查询结果如下:



 

         A2= A1.create()

 

         根据A1的序表创建新序表,并复制A1的结构,用于存储最终结果集。结果如下:



 

         A3=A1.(OPID.array().(A2.record([A1.LOGTIME,A1.USERID,~])))

 

         循环A1序表,拆分OPID字段值,转为转为序列,并将拆分后结果写回A2结果集。计算后的A2结果如下:



 

         可以看到在集算器中通过这样简单的三行代码就完成了拆分记录的计算。另外,集算器可被报表工具或java程序调用,调用的方法也和普通数据库相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的计算结果,具体方法可参考相关文档。

  • 大小: 23.9 KB
  • 大小: 25.7 KB
  • 大小: 10.8 KB
  • 大小: 58.8 KB
0
0
分享到:
评论

相关推荐

    ORACLE__SQL.pdf SQL.Cookbook.pdf

    3. **数据转换**:如何通过SQL进行数据整理,如计算新列、拆分和合并字段。 4. **报表和分析**:如何构建复杂的报表,使用GROUP BY、HAVING和透视表进行数据分析。 5. **数据导入导出**:介绍如何将数据导入到...

    Teach Yourself SQL in 21 Days

    ### 教你自己SQL在21天内 #### 第一周概览 **Day1:SQL简介** - **SQL定义**:SQL(Structured Query Language)是一种用于管理关系数据库的标准语言。 - **SQL用途**:用于创建、读取、更新和删除数据库中的数据。...

    员工工资管理系统(VB+SQL)

    在员工工资管理系统中,它可能强调了系统如何简化工资计算、提高数据管理效率,以及如何通过VB和SQL Server 2000的结合实现数据的实时更新和查询。 ### 绪论 1. **数据库管理系统**:讨论了数据库管理系统的作用,...

    sqlserver 数据库设计模板

    - **函数**:同样需要说明功能、参数,处理算法和注释,函数通常用于返回单一值,简化复杂的计算或逻辑操作。 - **触发器**:关联特定的表,按照DML操作(INSERT、UPDATE、DELETE)触发,详细说明触发条件和执行的...

    Oracle Sql 优化

    ##### 3.10 计算记录条数 使用`COUNT(*)`时,如果只需要计算非NULL的列,使用`COUNT(column_name)`会更高效。 ##### 3.11 用Where子句替换HAVING子句 在可能的情况下,使用WHERE子句代替HAVING子句,因为HAVING...

    sql写法_CTE

    1. **简化多层嵌套查询**:使用CTE可以将复杂的嵌套查询拆分为多个步骤,每一步作为一个单独的CTE,这样不仅提高了查询的可读性,还便于调试和维护。 2. **数据聚合**:CTE可以用来聚合数据,例如计算总和、平均值等...

    GBase 8a MPP Cluster SQL参考手册

    3. 插入、更新和删除数据:INSERT语句用于向表中添加新记录,UPDATE用于修改现有记录,而DELETE用于删除记录。手册还会介绍如何批量操作这些数据操作。 4. 视图:视图是虚拟的表,由SELECT语句的结果集构成。通过...

    mysql军规-sql规范

    - **建议**:避免使用复杂的SQL语句,将大事务拆分为多个小事务,减少批量操作的数量。 #### 二、字段类军规 **1. 用好数值类型** - **解释**:合理选择数值类型能够有效节省存储空间,提高查询效率。 - **建议**...

    分页工具(用于发布式,子任务拆分)

    1. **计算总页数**:根据总记录数和每页记录数来确定分页的总页数。 2. **获取指定页的数据**:接受页码和每页大小,返回对应的数据列表。 3. **构建分页对象**:包含当前页、总页数、每页大小、总记录数等信息,...

    PostgreSQL慢SQL调优手册

    **PostgreSQL 慢 SQL 调优手册** 1、**Create Index Directly** 创建合适的索引是优化查询性能的关键。为经常出现在 WHERE 子句中的列创建索引可以显著提升查询速度。例如,如果你的查询频繁地过滤某个特定列,如 ...

    SQL_Server_2005_入门教程

    ### SQL Server 2005 入门教程 #### SQL Server 概述 SQL Server 是一个由微软开发的关系型数据库管理系统。它最初是由 Microsoft、Sybase 和 Ashton-Tate 三家公司合作开发,于1988年发布了首个 OS/2 版本。随着 ...

    SQL编程书写的规范及一些书写优化性能建议

    10. **子句拆分与索引**:`IN`和`OR`子句可能导致索引失效,适当拆分并确保子句中有索引。 三、其他经验性规则: 1. **减少嵌套查询**:用`NOT EXISTS`替代`NOT IN`,减少表扫描。 2. **多表连接代替EXISTS**:在...

    SQL酒店管理系统实例.pdf

    - 收银结账模块:支持宾客结账、合并结账、拆分结账等多种方式,简化账单处理流程。 综上,SQL酒店管理系统是一个集成了数据库技术、软件工程和业务流程的综合性解决方案,通过高效的数据管理和自动化操作,助力...

    对 SYBASE SQL Server 中表查询方法的改进 (1).pdf

    在SYBASE SQL Server中,对表查询方法的改进是一个关键的优化策略,旨在提升数据库查询的性能和响应时间。随着信息系统规模的扩大和数据模型的复杂化,关注查询效率变得至关重要。本文主要讨论了如何通过改进查询...

    oracle官方教材

    - 简化SQL语句。 - 使用存储过程代替复杂的SQL语句。 **数据建模** - 合理设计关系模式。 - 适当使用规范化。 **表设计** - 选择合适的数据类型。 - 使用合适的约束。 **索引设计** - 根据查询需求选择合适的索引...

    Spark入门(完整版)

    DAG Scheduler将作业拆分为Stage,每个Stage由一系列Task组成。Task Scheduler负责将Task分配到Executor上执行。Executor是Spark运行时的进程,它们在集群中运行,负责执行计算任务和缓存数据。 五、Spark ...

Global site tag (gtag.js) - Google Analytics