基于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时间戳聚合数据创建数据库的主要内容,如果未能解决你的问题,请参考以下文章
Razor 视图中的 Epoch/Unix 时间戳(以毫秒为单位)到日期时间