2012-03-12 2 views
0

私はeventテーブルにタイムスタンプフィールドと、搾乳パーラーで収集された統計情報を含む多数のフィールドを持っています。PostgreSQLの期間でのイベントレコードの集計

これらのフィールドの平均、合計、およびカウントは、6:00〜18:00の間の12時間ごとに計算し、翌日の18:00〜6:00の間に計算する必要があります。

+0

テーブル定義とサンプルデータが役に立ちます。あなたは何を試しましたか? –

答えて

3

は、次のようになります。

テストのセットアップ:

-- DROP TABLE t; 
CREATE TEMP TABLE t (ts timestamp, val1 int, val2 int); 
INSERT INTO t VALUES 
('2012-03-12 06:00:00', 1, 12) 
,('2012-03-12 06:00:21', 2, 2) 
,('2012-03-12 06:53:21', 3, 45) 
,('2012-03-12 07:53:21', 8, 7) 
,('2012-03-12 08:53:21', 8, 6) 
,('2012-03-12 09:53:21', 6, 23) 
,('2012-03-12 10:53:21', 23, 43) 
,('2012-03-12 18:00:00', 4, 58) 
,('2012-03-12 19:00:00', 6, 57) 
,('2012-03-12 20:00:00', 8, 32) 
,('2012-03-13 20:00:00', 7, 12) 
,('2012-03-13 20:00:00', 9, 15) 
,('2012-03-14 20:00:00', 14, 14); 

問合せ:

SELECT (ts - interval '6h')::date AS day 
     ,CASE WHEN ts::time >= '6:00'::time 
      AND ts::time < '18:00'::time 
     THEN '6-18' 
     ELSE '18-6' 
     END AS shift 
     ,sum(val1) AS val1_sum 
     ,sum(val2) AS val2_sum 
     ,count(*) As ct 
FROM t 
GROUP BY 1,2 
ORDER BY 1,2; 

結果:

day  | shift | val1_sum | val2_sum | ct 
------------+-------+----------+----------+---- 
2012-03-12 | 6-18 |  51 |  138 | 7 
2012-03-12 | 18-6 |  18 |  147 | 3 
2012-03-13 | 18-6 |  16 |  27 | 2 
2012-03-14 | 18-6 |  14 |  14 | 1 

注私は時間をずらす方法を取得します一貫性のある日付と私が012を使用する方法正確な時間範囲についてはおよび<です。

関連する問題