当前位置: 首页 > news >正文

怎样用 esProc 生成定长时间窗口列表并统计

某库表的 Time 字段是时间,Value 字段是需要统计的值。

TimeValue
10:10:053
10:11:064
10:13:135
10:13:199
10:13:328
10:14:352

现在要将数据按每分钟分成一个窗口,补上缺失的窗口,对每个窗口统计 4 个值:start_value,前一个窗口的最后一条;本窗口的最后一条;本窗口的最小值;本窗口的最大值。首个窗口的 start_value 用第一条记录的值代替;如果缺少某窗口的统计值,则用本窗口的 start_value 代替。

上例的计算结果如下:

startendstart_valueend_valueminmax
10:10:0010:11:003333
10:11:0010:12:003444
10:12:0010:13:004444
10:13:0010:14:004859
10:14:0010:15:008222

涉及到生成时间序列、按时间序列对齐并分组、保持分组子集、按相对位置从子集取记录,SQL 很难直接实现。

esProc 提供了丰富的计算函数,包括生成时间序列,按序列对齐、保持分组子集、按位置访问:esProc Web Try

 A
1$select * from main.txt order by Time
2=A1.run(Time=time@m(Time))
3=list=periods@s(A2.min(Time),A2.max(Time),60)
4=A2.align@a(list,Time)
5=A4.new(list(#):start, elapse@s(start,60):end, sv=ifn(end_value[-1],~.Value):start_value, ifn(~.m(-1).Value, sv):end_value, ifn(~.min(Value),sv):min, ifn(~.max(Value),sv):max)

A1:加载数据。

A2:将 Time 字段修改为整分钟数,比如 10:10:05->10:10:00。函数 run 用于循环修改记录,函数 time 可以格式化时间,@m 表示取整分钟数。

A3:根据起止时间,生成连续分钟数的时间序列。函数 periods 用于生成时间序列,@s 表示间隔单位是秒。

Picture1png


A4:将数据按时间序列对齐,每组是一个窗口的数据,有些窗口是空集,没有对应的记录,比如 10:12:00。函数 align 可将记录按指定序列对齐,默认取各组第 1 条记录,@a 表示取所有记录。对齐后不能立刻汇总,而是要保持分组子集,用于进一步计算。

Picture2png


A5:用 new 函数生成新二维表,A4 的每组数据(每个窗口)对应一条新记录。

Picture3png

start 是当前窗口的起始时间,list(#) 表示按位置从 list 取成员,# 是当前窗口的序号。

end 是当前窗口的终止时间,elapse@s(start,60) 表示起始时间加 60 秒钟后的时间,函数 elapse 用于时间加减,@s 表示单位为秒。

start_value是前一个窗口的最后一条,sv=ifn(end_value[-1],~.Value)表示取上一个窗口的 end_value(后面有解释),如果该值为空,则取本窗口默认(第 1 条记录)的 Value;最后将变量 sv 赋值为 start_value。函数 ifn 返回首个非空的参数。[-1] 表示上一条记录 / 上一组 / 上一个窗口。~ 表示当前记录 / 当前组 / 当前窗口。

end_value 是本窗口的最后一条,ifn(~.m(-1).Value, sv)表示取本窗口的最后一条的 Value,如果该值为空,则取 sv。函数 m 可按绝对位置取成员,m(-1)表示倒数第 1 条,m(n)是正数第 n 条,可以简写做 (n),前面的 list(#) 就是这种用法。

min是本窗口的最小值,ifn(~.min(Value),sv) 表示取本窗口的最小值,如果该值为空,则取 sv。max 是本窗口最大值,代码类似。

esProc是开源免费的,下载试用~~

http://www.xdnf.cn/news/571465.html

相关文章:

  • 【Java高阶面经:微服务篇】7. 1秒响应保障:超时控制如何成为高并发系统的“救火队长”?
  • esp32cmini SK6812 2个方式
  • redis--redisJava客户端:Jedis详解
  • WebFuture:在银河麒麟系统中如何无中间件为WebFuture绑定域名、SSL证书
  • 【Linux】借助gcc源码修改,搜索头文件当前进展
  • springboot链接nacos测试
  • 分类预测 | Matlab实现PNN概率神经网络多特征分类预测
  • 数学实验(Matlab绘图基础)
  • 大量程粗糙度轮廓仪适用于哪些材质和表面?
  • 矿物绝缘加热电缆行业2025数据分析报告
  • 使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第一部分)
  • Dockerfile指令详解
  • 打卡第二十四天
  • Swagger在java的运用
  • PostgreSQL 日常维护
  • Elasticsearch常用命令
  • 宁夏建设工程专业技术职称评审条件
  • 嵌入式Linux:移植使用scp指令
  • Java多线程深度解析:从核心机制到高阶实战
  • upload-labs通关笔记-第16关 文件上传之exif_imagetype绕过(图片马)
  • springcloud集成seata报错Error creating bean with name ‘globalTransactionScanner‘
  • 解决RedisTemplate的json反序列泛型丢失问题
  • SpringAI开发SSE传输协议的MCP Server
  • 安卓开发用到的设计模式(1)创建型模式
  • OpenCv高阶(十四)——LBPH人脸识别
  • 如何用 Qwen1.5-7B-Chat 模型打造高效轻量的 Python 智能助手(详细实操指南)
  • Windows在PowerShell或CMD运行 curl 命令报错 解决办法 (zx)
  • 如何支持Enhanced RTMP H.265(HEVC)
  • 蓝耘Ubantu服务器测试最新 PP-StructureV3 教程
  • linux 查看java的安装路径