Запрос одинаковых, но непересекающихся наборов данных в одном запросе SQL - PullRequest
0 голосов
/ 31 марта 2009

В 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 Ответ

1 голос
/ 31 марта 2009

Вы хотите объединить две (или более) таблицы:

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

Обратите внимание, что "ALL" после UNION указывает запросу сохранять дублирующиеся строки (если в обеих таблицах появляются одинаковые значения - маловероятно в вашем сценарии). Я обычно использую UNION ALL, потому что я думаю, что это позволяет избежать лишних затрат на проверку данных на наличие дублирующихся строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...