在单个SQL查询中查询类似但不相交的数据集

时间:2009-03-30 22:50:42

标签: sql mysql sql-server

在SQL中(特别是MySQL,但问题是通用的),当我在不相交的时间范围内有多个表时,查询时间序列数据的最有效方法是什么?例如,如果我的表格如下:

router1_20090330( unixtime integer unsigned, 
                  iface1_in integer unsigned,
                  iface1_out integer unsigned )
router1_20090331( unixtime integer unsigned, 
                  iface1_in integer unsigned,
                  iface1_out integer unsigned )

依此类推,使用(比如)1分钟的interface1进出流量样本,每天提供86400条记录。

我希望查询表示类似

的内容
SELECT CAST(unixtime/3600 as unsigned) AS hour, 
       sum(iface1_in), sum(iface1_out) 
  from router1_20090330 *then* router1_20090331
  group by hour order by hour;

即。我希望查询和汇总这两个表,但是一个接一个地而不是加入。

1 个答案:

答案 0 :(得分:1)

您希望UNION两个(或更多)表:

SELECT CAST(unixtime/3600 as unsigned) AS hour,
    SUM(iface1_in), SUM(iface1_out)
FROM (
    SELECT * FROM router1_20090330
    UNION ALL
    SELECT * FROM router1_20090331
) x
GROUP BY hour
ORDER BY hour

请注意,UNION之后的“ALL”会告诉查询保留重复的行(如果两个表中都显示相同的值 - 在您的方案中不太可能)。我通常使用UNION ALL,因为我认为它避免了为重复行测试数据的开销。