基于unix时间戳聚合数据创建数据库
Aggregate data based on unix time stamp crate database
我对 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 不支持的 sql 查询。
请帮帮我?
我正在寻找每小时数据的答案如下。
传感器,读数,时间戳
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)
一个直接的方法是:
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
您可以使用 to_timestamp()
将 unix 时间戳转换为 date/time 值。您可以使用 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) );
我对 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 不支持的 sql 查询。 请帮帮我?
我正在寻找每小时数据的答案如下。
传感器,读数,时间戳
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)
一个直接的方法是:
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
您可以使用 to_timestamp()
将 unix 时间戳转换为 date/time 值。您可以使用 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) );