Я работаю с таблицей, в которой каждая строка имеет отметку времени, и эта отметка времени уникальна для заданного набора других значений столбца:
CREATE TEMPORARY TABLE time_series (
id SERIAL PRIMARY KEY,
created TIMESTAMP WITH TIME ZONE NOT NULL,
category TEXT,
value INT
);
CREATE UNIQUE INDEX ON time_series (created, category);
INSERT INTO time_series (created, category, value)
VALUES ('2000-01-01 00:00:00Z', 'foo', 1),
('2000-01-01 06:00:00Z', 'bar', 5),
('2000-01-01 12:00:00Z', 'bar', 5),
('2000-01-02 00:00:00Z', 'bar', 5),
('2000-01-02 12:34:45Z', 'bar', 2),
('2000-01-03 00:00:00Z', 'bar', 3),
('2000-01-04 00:00:00Z', 'bar', 3),
('2000-01-04 11:11:11Z', 'foo', 4),
('2000-01-04 22:22:22Z', 'bar', 5),
('2000-01-04 23:23:23Z', 'bar', 4),
('2000-01-05 00:00:00Z', 'foo', 1),
('2000-01-05 23:23:23Z', 'bar', 4);
Временные метки расположены неравномерно. Моя задача, учитывая произвольное время начала и окончания, состоит в том, чтобы получить записи между этими датами и временем и записи непосредственно до и после этого диапазона. В общем, как мне упростить этот запрос: сильный>
(SELECT created, value
FROM time_series
WHERE category = 'bar'
AND created < '2000-01-02 06:00:00Z'
ORDER BY created DESC
LIMIT 1)
UNION
(SELECT created, value
FROM time_series
WHERE category = 'bar'
AND created >= '2000-01-02 06:00:00Z'
AND created < '2000-01-04 12:00:00Z')
UNION
(SELECT created, value
FROM time_series
WHERE category = 'bar'
AND created >= '2000-01-04 12:00:00Z'
ORDER BY created
LIMIT 1)
ORDER BY created;
created value
2000-01-02 00:00:00+00 5
2000-01-02 12:34:45+00 2
2000-01-03 00:00:00+00 3
2000-01-04 00:00:00+00 3
2000-01-04 22:22:22+00 5
Вариант использования — получение точек данных для отображения графика: я знаю дату и время левого и правого краев графика, но в целом они не будут точно соответствовать created
дате и времени, поэтому для отображения графика полностью до край Мне нужна точка данных по обе стороны от диапазона.
Нерешения:
- Я не могу не просто выбрать весь диапазон, потому что он может быть огромным.
- Я не могу выбрать какой-либо произвольно длинный период за пределами заданного диапазона, потому что этот набор данных может снова быть огромным или какой бы период я ни выбрал, может быть недостаточно для получения следующих показаний.