如何按时间戳平均 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'
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
| 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 |
我在 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'
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
| 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 |