Выберите данные за период времени - PullRequest
1 голос
/ 13 сентября 2011

Я немного новичок, когда дело доходит до postgres, так что потерпите меня немного, и я посмотрю, смогу ли я выложить достаточно информации.

я вставляю данные о погоде в таблицу каждые 10 минут, у меня есть столбец времени с отметкой даты эпохи.

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

То, что я хотел бы сделать, это просмотреть строки до конца каждого часа и получить эту строку, но делать это в течение последних 4 часов, так что я буду возвращать только 4 строки.

Возможно ли это в 1 запросе? Или я должен сделать несколько запросов?

Я хотел бы сделать это в 1 запросе, но не суетиться ...

Спасибо


Спасибо, ребята, за ваши ответы, я был / немного смущен вашим Гэвином - извините :) происходит от незнания этого ужасно хорошо.

Я все еще немного не уверен в этом, поэтому я попытаюсь объяснить это немного лучше ..

У меня есть программа c, которая вставляет данные в базу данных каждые 10 минут, она считывает данные с устройства, которое поддерживает последний дождь, поэтому каждые 10 минут она может увеличиваться на x. Итак, я думаю, у меня есть 6 строк / час данных. Мой план состоял в том, чтобы возвращаться (на моей странице php) каждые 7, что будет последней записью за каждый час, и просто получить это значение. Следовательно, почему бы мне только когда-нибудь понадобилось 4 строки ... просто немного разнесенных!

В моей таблице (показаниях) есть такие данные

index | time (text)  | last hrs rain fall (text)
1     | 1316069402   | 1.2

Все уши к лучшему способу его хранения тоже :) Я очень ценю вашу помощь, ребята, спасибо.

Ответы [ 3 ]

4 голосов
/ 13 сентября 2011

Вы должны быть в состоянии сделать это одним запросом ...

Будет ли что-то вроде:

SELECT various_columns,
    the_hour,
    SUM ( column_to_be_summed )
FROM ( SELECT various_columns,
            column_to_be_summed,
            extract ( hour FROM TIME ) AS the_hour
       FROM readings
      WHERE TIME > ( NOW() - INTERVAL '4 hour' ) ) a
GROUP BY various_columns,
    the_hour ; 

делать то, что вам нужно?

1 голос
/ 13 сентября 2011

Я не уверен, что это именно то, что вы ищете, но, возможно, это может послужить основой для адаптации. У меня часто есть потребность в создании сводных данных за периоды времени, хотя я не использую время эпохи, поэтому могут быть более эффективные способы манипулирования значениями, чем я придумал.

создать и заполнить тестовую таблицу

create table epoch_t(etime numeric);
insert into epoch_t 
select extract(epoch from generate_series(now(),now() - interval '6 hours',interval '-10 minutes'));

Чтобы разделить время на периоды:

select generate_series(to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz,
                       to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz - interval '4 hours', 
                       interval '-1 hour');

Преобразование времени эпохи в метку времени postgres:

select timestamptz 'epoch' + etime * '1 second'::interval from epoch_t;

затем усечь до часа:

select to_char(timestamptz 'epoch' + etime * '1 second'::interval,
               'yyyy-mm-dd hh24:00:00')::timestamptz  from epoch_t

Чтобы предоставить сводную информацию по часам:

select to_char(timestamptz 'epoch' + etime * '1 second'::interval,
               'yyyy-mm-dd hh24:00:00')::timestamptz,
       count(*)  
  from epoch_t 
 group by 1 
 order by 1 desc;

Если у вас могут быть пропуски в данных, но вам необходимо сообщить о нулевых результатах, используйте generate_series для создания периодов и оставьте соединение с таблицей данных. В этом случае я создаю образцы часовых сегментов назад до совокупности данных выше - 9 часов вместо 6 и присоединяюсь к преобразованию времени эпохи в метку времени, усеченную до часа.

select per.sample_hour,
       sum(case etime is null when true then 0 else 1 end) as etcount
  from (select generate_series(to_char(now(),
                               'yyyy-mm-dd hh24:00:00')::timestamptz,
                               to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz - interval '9 hours', 
                               interval '-1 hour') as sample_hour) as per
       left join epoch_t on to_char(timestamptz 'epoch' + etime * '1 second'::interval,
                                    'yyyy-mm-dd hh24:00:00')::timestamptz = per.sample_hour
group by per.sample_hour
order by per.sample_hour desc;
1 голос
/ 13 сентября 2011

ВЫБЕРИТЕ СУММУ (количество осадков) из данных о погоде, ГДЕ время> (СЕЙЧАС () - ИНТЕРВАЛ «4 часа»);

Я не знаю имен столбцов, но для этого следует использовать те, которые в заглавных буквах, типа pgsql.Это то, что вы после?

...