Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 Оконные функции по оси времени  [new]
korisk
Member

Откуда:
Сообщений: 52
Есть таблица триплетов (id датчика, время, показание):
create table triplets (id bigint, time bigint, value float);

Нужно получить средние значения для датчиков 1,2 за время с 10 до 20?

Оконные функции работают только по значениям поля, с функцией не работают, во всяком случае в PostgreSQL.

Корректный запрос, но не отвечающий на поставленный вопрос:
select id, time, value, avg(value) over (partition by time,id) from triplets where id in (1,2);

Примерный закрос который вроде должен работать как надо, но не работает:
select id, time, value, avg(value) over (partition by (time > 10 and time < 20),id) from triplets where id in (1,2);

Вопрос:
Каким стандартным запросом получить средние значения для датчиков 1,2 за время с 10 до 20?
С помощью каких расширений можно решить задачу?

Может я чего-то не знаю, тогда поделитесь плз, ключевыми словами.

Спасибо.
10 сен 13, 19:32    [14822280]     Ответить | Цитировать Сообщить модератору
 Re: Оконные функции по оси времени  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54751

korisk
Каким стандартным запросом получить средние значения для датчиков 1,2 за
время с 10 до 20?

Если бы время хранилось как у нормальный людей в поле типа TIME, то работал бы обычный
запрос без всякой аналитики:
select id, avg(value) from triplets
  where id in (1,2) and "time" between time'10:00' and time'20:00'
  group by id

Posted via ActualForum NNTP Server 1.5

10 сен 13, 19:43    [14822315]     Ответить | Цитировать Сообщить модератору
 Re: Оконные функции по оси времени  [new]
korisk
Member

Откуда:
Сообщений: 52
Хаха! ) Спасибо большое. Что-то я перемудрил.
10 сен 13, 20:05    [14822376]     Ответить | Цитировать Сообщить модератору
 Re: Оконные функции по оси времени  [new]
korisk
Member

Откуда:
Сообщений: 52
Хотя нет. Это я вопрос не правильно сформулировал.

Нужне результат N запросов:
select avg(value2) from (select avg(value) as value2 from triplets
  where id in (1,2) and "time" between time'10:00' and time'14:00'  group by id) as val;

select avg(value2) from (select avg(value) as value2 from triplets
  where id in (1,2) and "time" between time'14:00' and time'18:00'  group by id) as val;

select avg(value2) from (select avg(value) as value2 from triplets
  where id in (1,2) and "time" between time'18:00' and time'22:00'  group by id) as val;
....

в виде:
time|value
10:00| xxx
14:00| yyy
18:00| zzz
...

либо

select avg(value2) from (select avg(value) as value2 from triplets
  where id in (1,2) and "time" between time'10:00' and time'14:00'  group by id) as val;

select avg(value2) from (select avg(value) as value2 from triplets
  where id in (3,4) and "time" between time'10:00' and time'14:00'  group by id) as val;

select avg(value2) from (select avg(value) as value2 from triplets
  where id in (5,6) and "time" between time'10:00' and time'14:00'  group by id) as val;
....

id|value
1| xxx
3| yyy
5| zzz
...


Спасибо
10 сен 13, 21:03    [14822607]     Ответить | Цитировать Сообщить модератору
 Re: Оконные функции по оси времени  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54751

korisk
Хотя нет. Это я вопрос не правильно сформулировал.

Вторая попытка тоже провалилась. Иди ещё подумай.

Posted via ActualForum NNTP Server 1.5

10 сен 13, 21:38    [14822698]     Ответить | Цитировать Сообщить модератору
 Re: Оконные функции по оси времени  [new]
lookat
Member

Откуда:
Сообщений: 135
korisk,

Данных нет, а потому непонятно:

1. Датчики дают показания через
фиксированный интервал времени?
То есть регулярно? Или нет?

2. Как изменяется из меняемая величина
Между показаниями, непрерывно или скачком?

3. Показания датчиков 1 и 2 синхронизированы по времени?

Ответы на эти вопросы влияют на метод вычисления среднего за период.

Удачи
10 сен 13, 22:42    [14822971]     Ответить | Цитировать Сообщить модератору
 Re: Оконные функции по оси времени  [new]
korisk
Member

Откуда:
Сообщений: 52
Dimitry Sibiryakov
Вторая попытка тоже провалилась. Иди ещё подумай.

Согласен, туплю, но ближайшее время надежда только на телепатов. :(
Возможно, это можно назвать вычислением агрегатной функции по квадрату.


lookat
1. Датчики дают показания через
фиксированный интервал времени?
То есть регулярно? Или нет?

Да, регулярно.

lookat
2. Как изменяется из меняемая величина
Между показаниями, непрерывно или скачком?

В общем случае скачком.

lookat
3. Показания датчиков 1 и 2 синхронизированы по времени?
Удачи

Да, показания синхронизированы. (у одновременных "отсчетов" time одинаковый)

Спасибо.
11 сен 13, 05:29    [14823777]     Ответить | Цитировать Сообщить модератору
 Re: Оконные функции по оси времени  [new]
tanglir
Member

Откуда:
Сообщений: 28966
korisk
select avg(value2) from (select avg(value) as value2 from triplets
  where id in (1,2) and "time" between time'10:00' and time'14:00'  group by id) as val;
b чем это отличается от обычного
select avg(value) as val from triplets
  where id in (1,2) and "time" between time'10:00' and time'14:00'
?
korisk
Возможно, это можно назвать вычислением агрегатной функции по квадрату.
по какому такому "квадрату"?
и вообще, не это ли вы ищете?

select cast(g.t as time) as _t,avg(f.r)
from 
generate_series(timestamp'2000-01-01 00:00:00',timestamp'2000-01-01 00:01:00',interval'4 second') as g(t) -- сюда подставить нужное мин/макс время
join
(select qwe.t,random()*100 as r from
 generate_series(timestamp'2000-01-01 00:00:00',timestamp'2000-01-01 00:01:00',interval'1 second') as qwe(t)
 ) f -- а это аналог исходной таблицы
on g.t<=f.t and f.t<g.t+interval '4 second'
group by _t
order by _t
11 сен 13, 06:32    [14823911]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить