从多个SQL表中提取数据的最有效技术

时间:2016-03-28 18:31:12

标签: sql jdbc database-design scripting monetdb

我有一个问题决定如何解决问题 - 我们将monetDB与JAVA jdbc程序结合使用。如果我能够使用SQL查询解决我的问题,如果我需要编写脚本,或者可能在JAVA中进行计算,我想要一些指导。

我们有大约3个月的数据(~90个表),每个数据都带有表名中的日期,每个表都包含简化的时间序列交易数据。

TableMarch1
Time Symbol Vol
9:30 X      100
9:31 Y      200
9:31 X      100
...
TableMarch2
Time Symbol Vol
9:30 X      500
9:31 Y      300
9:31 Y      100
...

我的任务是以15分钟的间隔(即9:30-9:45,9:45-10:00)分析一天中不同时段的活动。表中可能包含许多符号,但我们会一次分析一个。

理想情况下,我想为每个日期的每个时间段汇总每个符号的总量,但也可以将数据合并并稍后计算总数:

Result table1(930-945)
Date  Time       Sym Total Volume
March 1 9:30-9:45  X   200
March 1 9:30-9:45  Y   300
March 2 9:30-9:45  X   500
...
Result table 2(945-1000)
March 1 9:45-10:00 X   1000
March 1 9:45-10:00 Y   500

因此,最终我可以对单个符号的每个间隔进行统计计算。我不确定是否有一种有效的方法从所有过时的表中提取数据并根据时间片创建新的视图/表。我能够通过JDBC实时测试和查询所有这些表来强制解决问题 - 但是一次查询90个表1中的数据并将所有数据划分为15分钟桶是非常昂贵的操作然后从那里进行统计计算,所以我觉得必须有一种方法在数据库中设置一个新的结构,以简化获取这些数据 - 但我不确定如何做到这一点,而无需手动处理从中提取数据每张表1一次。

我可以使用单个SQL语句以多种方式从多个表中提取数据来创建具有所需结果的视图或新表(基本上任何技术都可以避免为每个单个案例和日期编写新查询)?有没有办法编写一个case语句,根据案例插入到不同的表中?有没有办法配置monetdb来更有效地运行这些查询?或者我是否需要编写一个脚本来一次处理一个表并将所有内容都放入新表中?

1 个答案:

答案 0 :(得分:0)

要隐藏数据结构的复杂性,您可以使用SQL视图和联合的组合来提供数据的统一视图。

SQL Group By谓词将允许您按时间片聚合数据。

根据您的示例,您将ViewMarch视图定义为:

CREATE TABLE TableMarch1(Time timestamp, Symbol integer, value integer);
CREATE TABLE TableMarch2(Time timestamp, Symbol integer, value integer);

CREATE VIEW ViewMarch AS 
    SELECT Time, Symbol, Value FROM TableMarch1 
    UNION 
    SELECT Time, Symbol, Value from TableMarch2;

然后,您可以计算每小时的平均符号值,例如,使用如下查询:

SELECT LEFT(Time, 13) AS Period, Symbol, AVG(Value) 
    FROM ViewMarch 
    GROUP BY Period, Symbol;

但请注意性能成本。我不知道MonetDB如何优化对工会的查询。