【问题标题】:How can I average table rows by timestamp?如何按时间戳平均表行?
【发布时间】:2015-09-26 05:27:43
【问题描述】:

我在 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

【问题讨论】:

  • 您的“TimeStamp”列的 0 值是多少? PostgreSQL 有一个 timestamp 数据类型,它是自 1970-01-01 00:00:00 以来经过的秒数。如果您的时间戳具有相同的基础,我建议您将列更改为 timestamp 类型,以便您可以使用 PostgreSQL 中所有可用的标准日期/时间操作例程。

标签: postgresql timestamp


【解决方案1】:

我会将 "TimeStamp" 列类型更改为 timestamp 类型(并且可能将列名称更改为 "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)

【讨论】:

  • 我认为这已经是其中的一部分,但是当用分钟完成时,它看起来像是创建了一个最多有 60 行的表,并且 date_part 从 [0...59] 开始。例如,我希望保留年、月、日等,并让时间列按小时递增,因此两天的采集将产生一个有 48 行的表。
【解决方案2】:

尝试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 |

【讨论】:

  • 我做了,但我的代表还不够高,无法显示投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多