TimescaleDB / PostgreSQL суточных максимумов со смещением часового пояса - PullRequest
0 голосов
/ 06 января 2020

У меня проблема с сортировкой и запросом данных со смещением часового пояса.

У меня есть PostgreSQL + TimescaleDB, где у меня есть данные временных рядов. Цель состоит в том, чтобы получить дневные максимумы на основе местного часового пояса. Мои данные в UT C, но запрос должен быть в местном часовом поясе, поскольку мои накопительные счетчики сбрасываются по местному времени.

Цель должна иметь результат, как показано ниже

  id   |    time    |      dailymax    |        name
-------+---------------------+------------------+------------------------
 10001 | 2020-01-05 |                0 | Property1
 10002 | 2020-01-05 | 20930.3490579984 | Property2
 10003 | 2020-01-05 | 28347.1322223556 | Property3
 10001 | 2020-01-04 | 57872.3274949118 | Property1
 10002 | 2020-01-04 | 101159.612050399 | Property2
 10003 | 2020-01-04 |  34113.226521315 | Property3
 10001 | 2020-01-03 |                0 | Property1
 10002 | 2020-01-03 | 17386.2914203308 | Property2
 10003 | 2020-01-03 | 160599.774657208 | Property3

My Наилучшее предположение до сих пор касалось запроса, приведенного ниже, но он также дает мне записи о неправильных днях и занимает много времени для выполнения

SELECT table.id, CAST(datetime AS DATE) AT TIME ZONE 'America/New_York' as time, MAX(value) AS value, map.tagname FROM table
                      JOIN map ON table.id = map.id
                        WHERE table.id in(10003,10029,10008,10036,10007) AND datetime AT TIME ZONE 'UTC' >= '2019-12-30T16:09:32.080Z' AND datetime AT TIME ZONE 'UTC' < '2020-01-06T16:09:32.080Z'
                    GROUP BY table.id, map.tagname, time
                    ORDER BY time DESC;

С TimescaleDB пробовал что-то, как показано ниже, также с неудачей

SELECT table.id, to_char(time_bucket('24 hours', datetime) at time zone 'utc', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') as time, max(value) as value, map.name FROM
    table JOIN map ON table.id = map.id
    WHERE table.id in(10001,10002) AND datetime >= '2020-01-01' AND datetime < '2020-01-10'
GROUP BY time, table.id, map.name ORDER BY time DESC`;
...