powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Суммы по интервалу
11 сообщений из 11, страница 1 из 1
Суммы по интервалу
    #34947423
Alien777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
Не подскажете ли, как правильно построить запрос, если нужно получить суммы данных по интервалам 1мин(10мин, час...). Идея такая, что генериться паттерн типа:
SELECT '2007-11-16 10:30:00'::timestamp + g.x * interval'1 minute' FROM generate_series(0, 435) AS g(x))

и делается выборка для данных с timestamp
between '2007-11-16 10:30:00' And '2007-11-16 10:31:00'
between '2007-11-16 10:31:00' And '2007-11-16 10:32:00'
и тд.
Получится ли это сделать в sql запросе, или придеться ваять процедуру с циклом?

С уважением,

А.
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34947540
I00N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то на этом форуме видел такой вариант:

Код: plaintext
1.
2.
3.
SELECT SUM(CASE WHEN (t.a between значаение1 and значаение2) then t.a) as интервал1
               SUM(CASE WHEN (t.a between значаение3 and значаение4) then t.a)  as интервал2
FROM    t  
....                                      
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34948093
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все гораздо проще. группируйте по функции date_trunk.
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34949182
Alien777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо,
Но в варианте с date_trunc не получится выбрать произвольные интервалы - скажем сумма за каждые 15 секунд.
В моем варианте с генерацией паттерна можно бы было выбирать по произвольному интервалу, но у меня не получается уложить это в 1 запрос.

С уважением,

А.
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34949400
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alien777Но в варианте с date_trunc не получится выбрать произвольные интервалы - скажем сумма за каждые 15 секунд.

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT (date_trunc('second',now())::abstime)::int AS a
  ,((date_trunc('second',now())+'15 second')::abstime)::int AS b

 ,- (date_trunc('second',now())::abstime)::int
 + ((date_trunc('second',now())+'15 second')::abstime)::int AS delt;
------
 1195477437 ; 1195477452 ; 15 
как видим, можно группировать например по результатам целочисленного деления abstime-ов на 15 и т.п.. С более дробными дискретам тоже можно подобным образом исхитриться - сподобиться сгруппировать, но abstime-ы видимо там не помогут.
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34949625
Alien777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И за это спасибо, но сгенерировать периоды все-таки проще с помощью SELECT '2007-11-07 10:30:00'::timestamp + g * interval'7 minute' FROM generate_series(0, 435) AS intrvl. Просто ставите необходимое значение интервала.


Суть в том, что я хочу заменить процедуру типа
for intrvl in SELECT '2007-11-07 10:30:00'::timestamp + g * interval'7 minute' FROM generate_series(0, 435) AS intrvl
Select Sum(data) FROM table where timestamp between intrvl AND intrvl+7minute

одним sql запросом, т.к. полагаю, что запрос будет выполняться быстрее процедуры. Но никак не могу построить такой запрос.

С укважением,

А.
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34950203
Alien777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получается нечто вроде:
SELECT b.t, sum(a.data)
FROM XXX a, (SELECT '2007-11-07 10:30:00'::timestamp + g * interval'1 minute' AS t
FROM generate_series(0, 5) AS g) b
WHERE (date_trunc('minute', a.dealdatetime)>= b.t AND date_trunc('minute', a.dealdatetime) < (b.t + interval'1 minute')) GROUP BY b.t
ORDER BY b.t;

но работает медленно. Какие-нибудь советы плз.

С уважением,
А.
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34950381
Vladimir Sitnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
select date_trunc('minute', a.dealdatetime) as t, sum(a.data) as s
  from XXX as a
 where a.dealdatetime between '2007-11-07 10:30:00'::timestamp and '2007-11-07 10:45:00'::timestamp
 group by date_trunc('minute', a.dealdatetime)
+ индекс на dealdatetime
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34950387
Alien777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34954301
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alien777в варианте с date_trunc не получится выбрать произвольные интервалы - скажем сумма за каждые 15 секундгруппируйте по (date_part('epoch',$TIMESTAMP)/date_part('epoch','15 seconds'::interval))::int

Alien777Получается нечто вроде:
SELECT ... FROM XXX a ... FROM generate_series(0, 5) ...

но работает медленно.вот-вот. думаю, джоин с generate_series является не только лишним в этой задаче, но и медленным.

4321date_trunc('second',now())::abstimeпро abstime в доке нехорошее написано

The types abstime and reltime are lower precision types which are used internally. You are discouraged from using these types in new applications and are encouraged to move any old ones over when appropriate. Any or all of these internal types might disappear in a future release.
...
Рейтинг: 0 / 0
Суммы по интервалу
    #34954447
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat 4321date_trunc('second',now())::abstimeпро abstime в доке нехорошее написано

The types abstime and reltime are lower precision types which are used internally. You are discouraged from using these types in new applications and are encouraged to move any old ones over when appropriate. Any or all of these internal types might disappear in a future release.это я читал (когда потребовался подходящий время-датный тип), и это (для меня) плохо.

- пока это единственный (из найденных эмприрически) тип даты-времени, который не вызывает проблем при работе с Аксессом в кач-ве клиента (точность хранения не теряется на клиенте, и не вызывает ошибок типа "другой юзер подкрутил данные"). Т.е. такой, который позволяет перенести готовую аксовую приладу с минимальными доделками. А пускаться в суровые доделки старых прилад - нет никакого желания. Лучше уж заново строгать, и, видимо, с другим средством разработки клиента. Второй выход - хранить аксовую дату как float (как оно и есть "на самом деле"). Но тогда ,боюсь, запросы многие придется переписывать - надо тестировать, будет ли джет производить приведение даты-времени в параметрах к флоату и корректно отсылать тот далее - уже постгресу. Да и заплатка это. Ну их.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Суммы по интервалу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]