区间合并是我们经常遇到的一种复杂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
其中,ST和ET分别为操作起止时间,每个用户中的时间段可能重叠,现需要根据指定用户起止时间计算:
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形式的计算结果,具体方法可参考相关文档。
相关推荐
sqlserver 计算当月所有自然周的区间。
SQLSERVER计算年龄(岁月天),可以精确到岁,月,几月几天。
利于将多个分散的sal脚本合并为一个sql文件。
sqlserver 计算数据库时间差sqlserver 计算数据库时间差sqlserver 计算数据库时间差sqlserver 计算数据库时间差sqlserver 计算数据库时间差
非常适用于在Oracle中,把多个SQL文本文件合并为一个SQL文本文件,然后在 SQL*Plus中依次执行,也可以在应用程序中进行一次性建立数据库表。
根据 “出生日期” 使用 SQL 语句计算实足年龄。
Sql经纬度计算与C#经纬度计算
sql自定义函数,用于合并字符串列,可以在分组的情况下对varchar类型的字段合并
标题:按某字段合并字符串之一(简单合并) 描述:将如下形式的数据按id字段合并value字段。 id value —– —— 1 aa 1 bb 2 aaa 2 bbb 2 ccc 需要得到结果: id value —— ———– 1 aa,bb 2 aaa,bbb,...
自己写的一款合并sql文件的工具,用于多个sql语句的合并。合并后的总sql按照被合并的sql的文件名称时间顺序和序号进行排序,所以需要将要合并的sql语句名称打上时间和序号。内附有使用说明,用法简单易懂。
可以合并多个SQL文件,一般用于生产前数据合并 可选择文件夹进行合并
简化版SQL2000,使用方便,有用的人可以自由下载,我已经用了好几年了,请放心使用。
sqlserver 分组合并字符串 分组统计数量
你如果有很多个.sql文件,想合并到一起,那么这个工具绝对适合你
针对不确定的查询参数,简化SQL语句的拼写代码。目前支持Oracl及MySql数据库
支持合并任意数据库的sql,简单易用。将工具放置在sql脚本文件的同级目录下,双击工具,工具会自动创建一个文件夹,合并后的脚本就在该文件夹下
SQL Server各种日期计算方法SQL Server各种日期计算方法
可以实现多行查询数据转换到一行上显示,多行的某列信息用“,”号隔开。
Oracle9i的简化SQL语法 Oracle9i的简化SQL语法
SQLServer 根据生日计算年龄