我有一个大约 800 万行的表,我需要从中获取时间片数据。
我正在使用 PostgreSQL 9.1。
我需要每天查询此表以获取每个“object_id”(给定列表)的 max(start_time) 关联“数据”值的总和。(换句话说,对于特定列表中的每个 object_id,最接近每天结束的记录)。
这是基本的表结构:
CREATE TABLE checks (
id SERIAL PRIMARY KEY,
object_id INTEGER,
state INTEGER,
start_time TIMESTAMP,
data TEXT
);
data
是一个TEXT
字段,但具有numeric
值(我无法更改此方面,但可以使用强制转换进行转换)。
这是我目前正在使用的查询:
WITH object_ids AS (
SELECT object_id FROM objects WHERE object_id in (14845,12504,12451,12452)
),
records AS (
SELECT
data,
start_time,
MAX(start_time) OVER (PARTITION BY object_id)
FROM checks
WHERE
object_id IN (SELECT object_id FROM object_ids) AND
state = 0 AND
start_time BETWEEN '2013-05-01 00:00:00' AND '2013-05-02 00:00:00'
)
SELECT
SUM(data::bigint)
FROM
records
WHERE
max = start_time
我将为每个月的每一天运行此查询,以提供一组图表数据点。
我很想修改这个查询,这样我就不必每天运行单独的查询,而是一个查询返回一组每天的值
start_time | sum
---------------------------
2013-05-01 00:00:00 | 39118
2013-05-02 00:00:00 | 98387
2013-05-03 00:00:00 | 8384
我一直在研究时间片问题,它们非常有帮助(我将使用窗口函数的事实归功于 StackOverflow!),但我无法解决这个问题。