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

简化SQL式计算之区间合并

阅读更多

        区间合并是我们经常遇到的一种复杂SQL计算,如进行不重复时间段汇总,或将重叠的时间段合并等计算。由于SQL集合无序,实现时需要采用递归的方式实现,而对于递归函数不足的数据库实现起来则更加困难。除了递归,SQL实现时还要依赖多层子查询嵌套问题,SQL语句过为冗长使得实现和修改起来都很困难。

    集算器在实现这类计算时则比较简单,可以通过直观分步的脚本实现区间合并,下面通过一个例子说明。

 

       用户操作记录表Udetail中存储各用户操作明细记录,部分源数据如下:

ID   UID        ST                        ET

1     1001       2014-9-1 10:00:00  2014-9-2 11:30:00

2     1001       2014-9-1 10:30:00  2014-9-2 11:00:00

3     1001       2014-9-3 11:00:00  2014-9-4 12:00:00

4     1001       2014-9-4 10:00:00  2014-9-5 13:00:00

5     1001       2014-9-4 15:00:00  2014-9-5 18:00:00

6     1002       2014-9-1 11:00:00  2014-9-2 11:30:00

7     1002       2014-9-1 10:30:00  2014-9-2 11:00:00

   

       其中,STET分别为操作起止时间,每个用户中的时间段可能重叠,现需要根据指定用户起止时间计算:

       1、合并重叠的时间段,生成新的时段记录;

       2、 汇总不重叠的总时间。

 

       集算器实现代码如下:



 

       其中:

       A1=db1.query("select * from udetail where UID=?",arg1)

 

       根据指定用户从数据库查询数据,arg1是外部参数,比如arg1=1001。部分查询结果如下:



 

         A2= A1.sort(ST).select(ET>ET[-1]).run(max(ST,ET[-1]):ST)

 

         该句代码首先按照起始时间排序(.sort(ST)),并选出结束时间大于上一结束时间的记录(.select(ET>ET[-1]),即删除完全重叠的时间段;最后取出起始时间和上一结束时间中最大值作为本条记录的起始时间,即可生成新的不重叠时段记录。结果如下:



 

       这里可以看到集算器中集合是有序的,所以可以直接通过序号引用上一条记录,这与SQL有很大不同。

         如果希望将连续的时间段合并为一个时段,可以将A2中的代码改为:A2=A1.sort(ST).select(ET>ET[-1]).run(if(ST<ET[-1],ST[-1],ST):ST).group(ST;~.m(-1).ET:ET)

 

       可以得到如下结果:



 

         A3=A2.sum(interval@s(ST,ET))

 

         汇总重叠总时间。计算结果如下:



 

         如果只汇总不重叠时间(不需要明细),可以将代码改为:

       A1.sort(ST).select(ET>ET[-1]).sum(interval@s(max(ST,ET[-1]),ET))

       如果时间跨度不大,还可以这样写:A1.(periods@s(ST,ET)).union().len()-2,通过计算时间点个数完成。

        

 

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

  • 大小: 23.2 KB
  • 大小: 42.7 KB
  • 大小: 37 KB
  • 大小: 20.7 KB
  • 大小: 10.1 KB
0
0
分享到:
评论

相关推荐

    SQL语句_sql语言_SQL语句_sql_SQL开发_wiree7w_

    标题中的"SQL语句_sql语言_SQL语句_sql_SQL开发_wiree7w_"暗示了我们主要探讨的是SQL语句的编写和使用,以及与SQL开发相关的主题。`wiree7w`可能是一个个人ID或者项目代号,这里不做深入解释,重点在于SQL的学习和...

    beginning sql code

    SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程语言,而Oracle则是一种广泛应用的关系数据库管理系统。"Beginning SQL Code" 涵盖了初学者在学习SQL时可能会遇到的基础概念和实践操作,包括...

    数据库 SQL查询语句

    ### 数据库 SQL 查询语句详解 #### 一、SQL 查询语句概述 SQL(Structured Query Language)是...随着实践经验的积累,你将会更加深入地理解 SQL 的强大之处,并能灵活运用各种高级查询技巧来满足复杂的数据分析需求。

    数据库应用模块(SQL Server平台)数据库管理员级

    进一步的查询处理技术涉及多个SQL语句的执行、数据排序、运算式、函数和集总函数的应用。例如,使用ORDER BY对数据进行升序或降序排序,运用算术运算和比较运算符进行复杂计算,以及使用如LEN、UPPER等字符串函数和...

    ORACLE+SQL性能调整

    Oracle SQL 性能调整是数据库管理员和开发人员必须掌握的关键技能,这关乎到数据库的运行效率和整体系统性能。以下是一些重要的优化策略和注意事项: 1. **选用适合的 ORACLE 优化器**:Oracle 提供了三种优化器,...

    vfp计算机二级考点-必考

    39. **SQL UNION 语句**:用于合并多个查询的结果集。 40. **SQL DISTINCT 关键字**:用于消除查询结果中的重复行。 41. **SQL BETWEEN 和 LIKE 运算符**:用于在 WHERE 子句中指定范围和模式匹配条件。 42. **...

    SYD_bin_combine.zip

    在数据分析和科学计算中,"bin"通常用于表示数据分箱,即将连续变量分成若干个离散的区间,以便进行统计分析或简化处理。例如,对年龄、收入等进行分组。而"combine"则意味着将这些分好的数据集进行整合,可能是为了...

    PyPI 官网下载 | gmql-0.0.6-py3-none-any.whl

    总之,gmql-0.0.6-py3-none-any.whl是一个针对Python 3环境设计的gmql库的二进制分发包,它为生物信息学家提供了便捷的数据处理工具,通过SQL式的接口,实现了基因组数据的高效分析。对于那些需要处理大规模基因组...

    Oracle资料.doc

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的功能来管理和组织数据。在Oracle中,表空间(Tablespaces)是存储数据库对象(如表、索引等)的主要逻辑结构。本篇将详细介绍如何创建和管理Oracle...

    labuladong的算法小抄完整版.pdf

    #### 区间调度之区间合并问题、区间交集问题 - 讲解区间调度问题中的两个实际问题,以及如何运用算法来解决。 #### 信封嵌套问题 - 提供一种利用动态规划解决信封嵌套问题的思路。 #### 几个反直觉的概率问题 - ...

    Oracle从入门到精通

    - **数字和日期表达式**:可以使用算术运算符进行数学计算。 - **NULL值**:表示未知或缺失的数据。 - **别名**:为表或列提供临时名称。 - **Spool**:将查询结果输出到文件。 - **连接操作符||**:用于连接两个...

    ORACLE中对大数据量表的处理方法 (1).pdf

    创建yb_fee表的分区可以使用如下的简化SQL命令,创建相应的表空间和指定大小,然后使用EXTENT MANAGEMENT LOCAL自动管理扩展。 综上所述,Oracle数据库提供了强大的工具和策略来处理大数据量表。无论是分表处理还是...

    【电气工控自动化】8 个 Python 高效数据分析的技巧.pdf

    `pd.concat()`按行或列连接DataFrame,`pd.merge()`根据指定的关键列(类似于SQL中的JOIN操作)合并DataFrame,而`pd.join()`基于相同的列名或索引进行合并。理解这三种方法的区别可以帮助你更有效地整合和分析数据...

    Oracle本地管理表空间

    - **自动管理空闲空间**:能够自动跟踪表空间内的空闲块,减少了手动合并自由空间的需求。 - **解决碎片问题**:允许由Oracle自动决定区块大小,或由DBA统一设置,有效避免了碎片化的出现。 - **降低系统资源消耗**...

    MySQL的分区表(PartitionedTable)功能详解

    MySQL的分区表(Partitioned Table)功能是一种高级的数据库设计技术,旨在提升数据库性能和简化数据管理。分区的原理是将一个大表物理地划分为更小、更易管理的部分,这样可以加速特定的SQL查询,尤其是那些涉及...

    2021-2022计算机二级等级考试试题及答案No.14541.docx

    - **扩展**:例如,在 SQL 中使用 `GETDATE()` 或 `CURRENT_TIMESTAMP` 来获取当前日期和时间;在 Python 中使用 `datetime.datetime.now()`。 ### 2. 滚动条控件的应用 - **知识点**:滚动条是一种常见的用户界面...

    超详细ORACLE培训实例

    - **SUN与Oracle合并背景**:2009年,Oracle宣布以74亿美元收购SUN,这一举措被视为Oracle进军云计算领域的关键步骤。SUN拥有强大的硬件基础和技术积累,特别是其在服务器、操作系统(如Solaris)及开源数据库MySQL...

    国内外优秀Excel插件合集

    PUP提供了一套完整的工具,用于计算置信区间、假设检验以及非参数统计方法,特别适合于在数据分析和质量控制中使用。 3. MZ-Tools (MZTools3VBASetup.exe) MZ-Tools 是一款针对Excel VBA(Visual Basic for ...

Global site tag (gtag.js) - Google Analytics