在 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 )
依此类推,(例如)接口(interface) 1 上进出流量的 1 分钟样本,每天提供 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;
即我希望对两个表进行查询和聚合,但是一个接着一个,而不是连接起来。
最佳答案
您想要合并两个(或更多)表:
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,因为我认为它可以避免测试重复行数据的开销。
关于sql - 在单个 SQL 查询中查询相似但不相交的数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/699368/