6

ネットワーク上の帯域幅の使用状況を一定期間保存する単一のテーブルがあります。1 つの列には日時 (主キー) が含まれ、別の列には帯域幅が記録されます。データは毎分記録されます。その時点で他のデータを記録する他の列があります。

ユーザーが 15 分間隔 (開始日と終了日を指定して 24 時間以内) にデータを要求した場合、単一のクエリで必要なデータを取得することは可能ですか、またはこれを行うにはストアド プロシージャ/カーソルを作成する必要がありますか? ? その後、ユーザーは 5 分間隔のデータなどを要求できます。

私はおそらくPostgresを使用するでしょうが、他にもっと良いNOSQLオプションはありますか?

何か案は?

4

2 に答える 2

12
WITH t AS (
   SELECT ts, (random()*100)::int AS bandwidth
   FROM   generate_series('2012-09-01', '2012-09-04', '1 minute'::interval) ts
   )

SELECT date_trunc('hour', ts) AS hour_stump
      ,(extract(minute FROM ts)::int / 15) AS min15_slot
      ,count(*) AS rows_in_timeslice               -- optional
      ,sum(bandwidth) AS sum_bandwidth
FROM   t
WHERE  ts >= '2012-09-02 00:00:00+02'::timestamptz -- user's time range
AND    ts <  '2012-09-03 00:00:00+02'::timestamptz -- careful with borders 
GROUP  BY 1, 2
ORDER  BY 1, 2;

CTE は、テーブルが保持するようなデータを提供します: 1 分あたり 1tつのタイムスタンプと数値。(その部分は必要ありません。代わりにテーブルで作業します。)tsbandwidth

これは、非常によく似た質問に対する非常によく似た解決策です-この特定の集計がどのように機能するかについての詳細な説明があります:

これは、実行中の合計に関する同様の質問に対する同様の解決策です-使用されるさまざまな機能の詳細な説明とリンクがあります。

コメントでの追加の質問

WITH -- same as above ...

SELECT DISTINCT ON (1,2)
       date_trunc('hour', ts) AS hour_stump
      ,(extract(minute FROM ts)::int / 15) AS min15_slot
      ,bandwidth AS bandwith_sample_at_min15
FROM   t
WHERE  ts >= '2012-09-02 00:00:00+02'::timestamptz
AND    ts <  '2012-09-03 00:00:00+02'::timestamptz
ORDER  BY 1, 2, ts DESC;

ウィンドウ内の最後の使用可能な行から、15 分間隔ごとに1 つの非集計サンプルを取得します。行が欠落していない場合、これは15分目になります。重要な部分はとです。 ここで使用される技術の詳細については、次のとおりです。DISTINCT ONORDER BY

于 2012-09-27T15:09:49.203 に答える
6
select
    date_trunc('hour', d) + 
    (((extract(minute from d)::integer / 5 * 5)::text) || ' minute')::interval
    as "from",
    date_trunc('hour', d) + 
    ((((extract(minute from d)::integer / 5 + 1) * 5)::text) || ' minute')::interval
    - '1 second'::interval
    as "to",
    sum(random() * 1000) as bandwidth
from 
    generate_series('2012-01-01', '2012-01-31', '1 minute'::interval) s(d)
group by 1, 2
order by 1, 2
;

それは5分間の範囲です。15 分の場合は 15 で割ります。

于 2012-09-27T14:32:36.383 に答える