2010-11-02 4 views
3

У меня есть две таблицыВыберите фиксированное количество строк из двух таблиц в SQL

table1 (p double precesion, t timestamp without zone) 

и

table2 (v double precision, t timestamp without zone) 

со значениями для каждой минуты.

Как выбрать 60 строк формы (t, v, p) за каждую минуту в заданный час?

Некоторые значения могут отсутствовать, в этом случае соответствующее возвращаемое значение должно быть NULL.

Должно быть ровно 60 строк за каждый час.

Я использую PostgreSQL.

+0

ли временные метки уникальны в пределах каждой данной минуты? Могут ли секунды меняться? – Quassnoi

ответ

1
SELECT '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL, v, p 
FROM generate_series(0, 59) m 
LEFT JOIN 
     table1 t1 
ON  t1.t >= '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL 
     AND t1.t < '2010-01-01 01:00:00'::DATE + (m + 1 || ' minute')::INTERVAL 
LEFT JOIN 
     table2 t2 
ON  t2.t >= '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL 
     AND t2.t < '2010-01-01 01:00:00'::DATE + (m + 1 || ' minute')::INTERVAL 

Это предполагает, что записи уникальны в течение каждой минуты (хотя секунды могут отличаться).

Если это не так, вы будете получать дубликаты.

В этом случае, вы можете объединить их (скажем, сумма):

SELECT '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL, 
     COALESCE 
     (
     SELECT SUM(p) 
     FROM table1 t1 
     WHERE t1.t >= '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL 
       AND t1.t < '2010-01-01 01:00:00'::DATE + (m + 1 || ' minute')::INTERVAL 
     ), 0) p, 
     COALESCE 
     (
     SELECT SUM(v) 
     FROM table2 t2 
     WHERE t2.t >= '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL 
       AND t2.t < '2010-01-01 01:00:00'::DATE + (m + 1 || ' minute')::INTERVAL 
     ), 0) v 
FROM generate_series(0, 59) m 
Смежные вопросы