1条回答 默认 最新
关注
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用Sakurazczxcz 2022-03-01 14:08用的sql server 2012,您看我这样写的对吗 Selete sum(iValue)/count(iTs)*60 from 表名 group by dId
电表名称 每分钟 每15分钟 每小时 a 1 15 60 b 1 15 60 c 1 15 60 赞回复
收起
请说明一下使用的是什么数据库,以及数据库的版本,还有你最终想得到的数据是长什么样子,有哪些字段。
我,先假定你这个数据可以确保每个电表每分钟都一条记录,最后想要的数据是在这个数据的基础上加三列,
那么这个最简单的写法就是用开窗函数的lag将上n行的数值拉到本行,再相减。
select a.*,
(lag(数值)over(partition by 电表名称 order by 数据生成时间))-a.数值 一分钟用电量,
(lag(数值,15)over(partition by 电表名称 order by 数据生成时间))-a.数值 十五分钟用电量,
(lag(数值,60)over(partition by 电表名称 order by 数据生成时间))-a.数值 一小时用电量 from 表 a
但是有部分数据库是不支持开窗函数的。
假设数据是不完整的或者存在某分钟的数据重复了,上面这个方法就会有偏差,但同理,假设倒推60分钟后,刚好那分钟没有采集到数据,这个该怎么算,你也得给个规则
另外,如果你是想聚合数据,按指定的时间点来进行分段统计,那么你需要说明一下每15分钟的第1分钟是从哪里开始
你这个格式的话,要说明一下每个字段打算怎么计算,明明输出的每个电表只有一行记录,哪里来的每小时?
如果是平均每小时的用电量,那只要算出平均每分钟直接乘60,
你用ivalue求和是不对的,因为这个值是抄表记录,不是表示1分钟用了这么多电,比如电表初始记录为1000,下1分钟电表为1020,那么这分钟就用了20度电,
因此你如果确定是计算平均用电的话,只需要
用的sql server 2012,您看我这样写的对吗 Selete sum(iValue)/count(iTs)*60 from 表名 group by dId
电表名称 | 每分钟 | 每15分钟 | 每小时 |
---|---|---|---|
a | 1 | 15 | 60 |
b | 1 | 15 | 60 |
c | 1 | 15 | 60 |
电表的用电量是每10秒上传一次
报告相同问题?