Sakurazczxcz 2022-03-01 11:56 采纳率: 66.7%
浏览 65
已结题

用SQL算出每块电表的用电量

怎么用sql求出每块电表每分钟,每15分钟,每小时的用电量。

img

  • 写回答

1条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-03-01 13:17
    关注

    请说明一下使用的是什么数据库,以及数据库的版本,还有你最终想得到的数据是长什么样子,有哪些字段。
    我,先假定你这个数据可以确保每个电表每分钟都一条记录,最后想要的数据是在这个数据的基础上加三列,
    那么这个最简单的写法就是用开窗函数的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度电,
    因此你如果确定是计算平均用电的话,只需要

    1. 拿每个电表的最后一个数值减去第一个数据,得到总用电量,
    2. 然后用最后一次时间减去第一次时间,得时长并转换为分钟,
    3. 最后用总用电量除以时长即可。
      但这种平均用电量在实际使用中并没有什么意义,看不到任何数据走势,无法区分用电高峰期
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    Sakurazczxcz 2022-03-01 14:08

    用的sql server 2012,您看我这样写的对吗 Selete sum(iValue)/count(iTs)*60 from 表名 group by dId

    电表名称每分钟每15分钟每小时
    a11560
    b11560
    c11560

    回复
    Sakurazczxcz 回复 Sakurazczxcz 2022-03-01 14:17

    电表的用电量是每10秒上传一次

    回复
    Sakurazczxcz 2022-03-01 14:31

    好的

    回复
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月8日
  • 已采纳回答 3月1日
  • 创建了问题 3月1日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部