2015-09-26 41 views
0

我有PostgreSQL中的表是這樣創建的:如何通過時間戳來平均表格行?

-- Table: myTable 
-- DROP TABLE myTable; 
CREATE TABLE myTable 
(
    "TimeStamp" double precision, 
    "Temperature" double precision, 
    "Pressure" double precision, 
    "Milligrams" double precision, 
    table_pkey serial NOT NULL, 
    CONSTRAINT myTable_pkey PRIMARY KEY (table_pkey) 
); 

其中timestamp是因爲某一天一定數目的逝去秒。

我看到如何平均一些表的行數,以產生一個精簡表。例如,

SELECT AVG("TimeStamp") "Seconds", AVG("Temperature") "Temperature", 
     AVG("Pressure") "Pressure", AVG("Milligrams") "Milligrams" 
FROM (SELECT ROW_NUMBER() OVER(ORDER BY null) - 1 rn, * FROM myTable) t 
GROUP BY (rn/120) 
ORDER BY rn/120 

將輸出一個表,每個輸出行的輸入行數爲120。

而不是將某些行數平均在一起,我想將一些TimeStamp跨度平均在一起。例如,生成一個表格,其中每行包含一天中每個小時的平均值。

編輯

這與改變時間戳列鍵入typestamp合併似乎工作:

SELECT date_trunc('hour', "Acquired"), AVG("Temperature"), 
AVG("Pressure"), AVG("Milligrams") 
FROM myTable 
WHERE 1=1 
GROUP BY date_trunc('hour', "Acquired") 
ORDER BY 1 
+0

什麼是你的 「時間戳」 列的0值? PostgreSQL有一個'timestamp'數據類型,它是從1970-01-01 00:00:00開始經過的秒數。如果您的時間戳具有相同的基礎,我建議您將列更改爲'timestamp'類型,以便您可以使用PostgreSQL中標準的所有日期/時間操作例程。 – Patrick

回答

1

我會改變「時間戳」列類型時間戳型(和可能會將列名更改爲「Created」以避免混淆),如下所示:

CREATE TABLE myTable 
(
    "Created" timestamp, -- CHANGED COLUMN DEFINITION 
    "Temperature" double precision, 
    "Pressure" double precision, 
    "Milligrams" double precision, 
    ... 
) 

因此,以生產,例如,其中每行都包含在一天的每個小時的平均值表,您可以通過相應地使用date_part數和組:

SELECT date_part('hour', created), AVG("Temperature") 
FROM myTable 
WHERE ... 
GROUP BY date_part('hour', created) 
+0

我認爲這是它的一部分,但是如果分鐘完成,看起來它會創建一個最多有60行的表格,並且date_part從[0 ... 59]開始。例如,我希望保留幾年,幾個月,幾天等時間列,並且時間列增加數小時,因此兩天的採集將導致一個48行的表格。 –

1

嘗試DATE_TRUNC()這將返回完整的日期/時間截短至要求的精度,如 '小時'

SQL Fiddle

的PostgreSQL 9.3架構設置

CREATE TABLE myTable 
    (Created timestamp) 
; 

INSERT INTO myTable 
    (Created) 
VALUES 
    ('2015-09-25 00:11:12'), 
    ('2015-09-25 00:45:46'), 
    ('2015-09-25 01:20:19'), 
    ('2015-09-25 01:54:53'), 
    ('2015-09-25 02:29:26'), 
    ('2015-09-25 03:04:00'), 
    ('2015-09-25 03:38:34'), 
    ('2015-09-25 04:13:07'), 
    ('2015-09-25 04:47:41'), 
    ('2015-09-25 05:22:14'), 
    ('2015-09-25 05:56:48'), 
    ('2015-09-25 06:31:22'), 
    ('2015-09-25 07:05:55'), 
    ('2015-09-25 07:40:29'), 
    ('2015-09-25 08:15:02'), 
    ('2015-09-25 08:49:36'), 
    ('2015-09-25 09:24:10'), 
    ('2015-09-25 09:58:43'), 
    ('2015-09-25 10:33:17'), 
    ('2015-09-25 11:07:50'), 
    ('2015-09-25 11:42:24'), 
    ('2015-09-25 12:16:58'), 
    ('2015-09-25 12:51:31'), 
    ('2015-09-25 13:26:05'), 
    ('2015-09-25 14:00:38'), 
    ('2015-09-25 14:35:12'), 
    ('2015-09-25 15:09:46'), 
    ('2015-09-25 15:44:19'), 
    ('2015-09-25 16:18:53'), 
    ('2015-09-25 16:53:26') 
; 

查詢1

SELECT date_trunc('hour', Created), COUNT(*) 
FROM myTable 
WHERE 1=1 
GROUP BY date_trunc('hour', Created) 
ORDER BY 1 

Results

|     date_trunc | count | 
|-----------------------------|-------| 
| September, 25 2015 00:00:00 |  2 | 
| September, 25 2015 01:00:00 |  2 | 
| September, 25 2015 02:00:00 |  1 | 
| September, 25 2015 03:00:00 |  2 | 
| September, 25 2015 04:00:00 |  2 | 
| September, 25 2015 05:00:00 |  2 | 
| September, 25 2015 06:00:00 |  1 | 
| September, 25 2015 07:00:00 |  2 | 
| September, 25 2015 08:00:00 |  2 | 
| September, 25 2015 09:00:00 |  2 | 
| September, 25 2015 10:00:00 |  1 | 
| September, 25 2015 11:00:00 |  2 | 
| September, 25 2015 12:00:00 |  2 | 
| September, 25 2015 13:00:00 |  1 | 
| September, 25 2015 14:00:00 |  2 | 
| September, 25 2015 15:00:00 |  2 | 
| September, 25 2015 16:00:00 |  2 | 
+0

這對我有用,謝謝。 –

+0

太好了。感謝貢獻者的好方法是通過投票。 –

+0

我做過了,但是我的代表還不夠高,無法顯示投票結果。 –