在这篇文章中,最初由格伦·保利撰写并发布到sybase.com网站2009年9月,Glenn谈到了内置RowGenerator表的使用。
只涉及不等式条件的连接条件很少,主要是因为大多数连接是通过引用完整性约束在表之间关联的。然而,在本周做一些分析时,我给出了一个例子,说明了一个不等式上的连接是有用的。
我的例子涉及到对具有"创建"和"完成"时间戳的项目任务做一些分析,类似于
我所查询的实际模式要比这个复杂得多,但这很简单这个例子用来说明基本思想。我想要的是创建一个结果集,web云服务器,每个星期都包含正在进行的项目数和在那一周完成的项目数。一旦数据每周分解出来,我就可以使用SQL Anywhere中的一些内置OLAP功能对中间结果进行历史分析。
函数DATEDIFF(week,completion,creation)给出两个时间戳之间的周差,大数据行业前景,所以这一部分很简单,我的云,但是对于那些跨越一个日历年的项目来说。尽管如此复杂,但更重要的问题是,im即时通讯云,我想为项目未完成的每一周生成一行。我需要用一些东西连接projects表来生成额外的行,但是什么呢?
SQL Anywhere数据库包含一个名为RowGenerator的表,正是出于这个目的;它是一个单列表(row_num),包含255行,值从1开始。为了生成我需要的结果集,这里有一个查询:
这个查询根据未完成值将内置的RowGenerator表连接到projects表。因此,对于每周未完成的项目,将在输出中生成一行,包括在同一周内创建和完成的项目(其中未完成周数为零)。将DATEPART函数与WEEK一起使用意味着一年中最多可以有54周,因为DATEPART定义了从星期日开始的一周。
一旦我有了这个结果集,我就可以将它嵌入一个派生表中,例如,以一种简单的方式按日历周对打开和完成的项目数求和。
结果的正确性解决方案取决于一个因素:不存在需要超过255周才能完成的项目,云端服务器,否则RowGenerator表中的行数不足,无法生成所需的行数。如果这是一个问题,SQLAnywhere提供了另一种行生成器机制:sau rowgenerator()系统过程。sau rowgenerator()过程接受三个参数:起始值、结束值和步长增量(默认值为1)。将sa_rowgenerator()连接到projects表与使用rowgenerator基表相同,因为SQLAnywhere支持表函数(FROM子句中的过程)。