如何按时间戳平均 table 行?

How can I average table rows by timestamp?

我在 PostgreSQL 中有一个 table 是这样创建的:

-- 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 是自特定日期以来经过的秒数。

我看到了如何对一些 table 行进行平均以生成压缩的 table。例如,

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

将输出一个 table,每个输出行压缩 120 个输入行。

我不想对一些行数进行平均,而是想对 TimeStamp 的一些跨度进行平均。例如,要生成一个 table,其中每一行包含一天中每个小时的平均值。

编辑

这与将时间戳列更改为类型 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

我会将 "TimeStamp" 列类型更改为 timestamp 类型(并且可能将列名称更改为 "Created" 以避免混淆),像这样:

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

因此,例如,要生成一个 table,其中每行包含一天中每个小时的平均值,您可以使用 date_part 并相应地分组:

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

尝试 DATE_TRUNC(),这将 return 完整的 date/time 截断为所需的精度,例如 'hour'

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 |