暂无图片
求助,当前有一个需求,要求把Postgresql数据库中的数据根据dataTime字段按一定的时间间隔获取数据
我来答
分享
Yanhong
2021-09-06
求助,当前有一个需求,要求把Postgresql数据库中的数据根据dataTime字段按一定的时间间隔获取数据
id        dataTime                  value

1        2020-10-10 00:00:00   1

2        2020-10-10 00:00:01    2

3        2020-10-10 00:00:02    3

4        2020-10-10 00:00:03    4

..                   .....                        ..

数据是一秒钟一条,例如时间间隔是10秒钟,就获取每一个区间的第一条数据,时间间隔是变量,可能是1秒钟,也可能是10分钟,一天,给为大佬帮帮我,我用mod(extract(second from dataTime)::int, 500)= 0 ,这里的500表示时间间隔为500秒,但是求出来的数据不对。数据库的时间类型是timestamq。

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
伊织鸟

使用窗口函数实现,窗口函数的好处是可以使用其他各种汇聚函数。

使用彭冲老师的测试表:

--每10second,一个区间 select distinct first_value(dt) over (partition by floor(extract(epoch from dt)/10)) from test order by 1 asc; --每10minute,一个区间 select distinct first_value(dt) over (partition by floor(extract(epoch from dt)/600)) from test order by 1 asc;

再次感叹一下,PG对研发实在是太友好了

暂无图片 评论
暂无图片 有用 2
暂无图片
彭冲

构建测试数据

create table test(dt timestamp,id int,val int);

insert into test select *,(random()*100)::int  from generate_series('2021-01-01'::timestamp,'2021-01-02'::timestamp,'1 sec') with ordinality;

假设按10秒间隔抽取数据:

with t as
(
 select dt,extract('epoch' from dt)::int as dt_epoch,id,val from test
)
select * from  t where mod(t.dt_epoch,10)=0;

image.png

假设按10分钟间隔抽取数据:

with t as
(
 select dt,extract('epoch' from dt)::int as dt_epoch,id,val from test
)
select * from  t where mod(t.dt_epoch,600)=0;

image.png

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏