Выберите фиксированное количество строк из двух таблиц в SQL - PullRequest
3 голосов
/ 02 ноября 2010

У меня есть две таблицы

table1 (p double precesion, t timestamp without zone) 

и

table2 (v double precision, t timestamp without zone) 

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

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

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

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

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

1 Ответ

1 голос
/ 02 ноября 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...