基于unix时间戳聚合数据创建数据库

Posted

技术标签:

【中文标题】基于unix时间戳聚合数据创建数据库【英文标题】:Aggregate data based on unix time stamp crate database 【发布时间】:2021-03-02 17:53:21 【问题描述】:

我对 SQL 和时间序列数据库非常陌生。我正在使用 crate 数据库(它认为使用的是 PostgreSQL)。我想按小时、天、周和月聚合数据。 Unix时间戳用于存储数据。以下是我的示例数据库。

|sensorid | reading    | timestamp|
====================================
|1        | 1604192522 | 10       |
|1        | 1604192702 | 9.65     |
|2        | 1605783723 | 8.1      |
|2        | 1601514122 | 9.6      |
|2        | 1602292210 | 10    |
|2        | 1602291611 | 12    |
|2        | 1602291615 | 10    |

我尝试了使用 FROM_UNIXTIME not supported 的 sql 查询。 请帮帮我?

我正在寻找每小时数据的答案,如下所示。

sensorid、读数、时间戳

1          19.65(10+9.65)        1604192400(starting hour unixt time)
2           8.1                  1605783600(starting hour unix time)
2           9.6                  1601514000(starting hour unix time)
2           32 (10+12+10)        1602291600(starting hour unix time)

我正在寻找每月数据的答案

sensorid  ,     reading  ,               timestamp
1           24.61(10+9.65+8.1)       1604192400(starting month unix time)
2           41.6(9.6+10+12+10)       1601510400(starting month unix time)

【问题讨论】:

请提供样本数据和期望的结果。我不清楚您所说的“我想按小时、天、周和月汇总数据”是什么意思。 【参考方案1】:

直截了当的方法是:

SELECT
    (date '1970-01-01' + unixtime * interval '1 second')::date as date,
    extract(hour from date '1970-01-01' + unixtime * interval '1 second') AS hour,
    count(c.user) AS count
FROM core c
GROUP BY 1,2 

如果您对在同一列中包含日期和时间感到满意(这对我来说似乎更有帮助),您可以使用date_trunc()

select 
    date_trunc('hour', date '1970-01-01' + unixtime * interval '1 second') as date_hour,
    count(c.user) AS count
FROM core c
GROUP BY 1,2 

【讨论】:

我真的对这个答案感到困惑 SQLParseException[Cannot find data type: date] 执行查询时出现此错误 查询中的日期是什么? @junealex:这是定义文字日期的语法:date '1970-01-01' 定义截至 1970 年 1 月 1 日的日期。 能否根据我的新编辑更改答案【参考方案2】:

您可以使用 to_timestamp() 将 unix 时间戳转换为日期/时间值。您可以使用grouping sets 同时沿多个维度进行聚合。所以,你可能想要:

select date_trunc('year', v.ts) as year,
       date_trunc('month', v.ts) as month,
       date_trunc('week', v.ts) as week,
       date_trunc('day', v.ts) as day,
       date_trunc('hour', v.ts) as hour,
       count(*), avg(reading), sum(reading)
from t cross join lateral
     (values (to_timestamp(timestamp))) v(ts)
group by grouping sets ( (year), (month), (week), (day), (hour) );

【讨论】:

@junealex 。 . .这基本上可以满足您的要求,但时间格式更具可读性。 如何使用 where 子句来进行基于 sensorid 的搜索? @junealex 。 . . WHERE 子句将介于 FROM 子句和 GROUP BY 之间。

以上是关于基于unix时间戳聚合数据创建数据库的主要内容,如果未能解决你的问题,请参考以下文章

怎么把Unix时间戳变成一般时间

Python在未来五分钟创建unix时间戳

Razor 视图中的 Epoch/Unix 时间戳(以毫秒为单位)到日期时间

从unix时间戳创建php DateTime对象,在一行中设置时区

如何根据unix中的时间戳对文件进行排序? [关闭]

Pandas 将带有 unix 时间戳(以毫秒为单位)的行转换为日期时间