タイム スライス データが必要な約 800 万行のテーブルがあります。
PostgreSQL 9.1 を使用しています。
日ごとに、各「object_id」(リストを指定) に関連付けられた max(start_time) の「data」値の合計をこのテーブルに照会する必要があります。(つまり、特定のリストの object_id ごとに、1 日の終わりに最も近いレコード)。
基本的なテーブル構造は次のとおりです。
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
このクエリを毎月実行して、一連のグラフ データ ポイントを取得します。
このクエリを変更して、1 日ごとに個別のクエリを実行する必要がないようにしたいのですが、1 つのクエリで 1 日あたりの値のセットを返します。
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 に対してウィンドウ関数を使用しているという事実を負っています!) が、この問題を解決するために飛躍することはできません。