如何根据用电记录计算用电量?

2024-04-10

我有一个表格,其中包含设备的功率值(kW)。每分钟从每个设备读取一次值,并将其插入带有时间戳的表中。我需要做的是计算给定时间跨度的功耗(kWh)并返回 10 个最耗电的设备。现在,我查询给定时间跨度的结果,并在后端循环所有记录中进行计算。这对于少量设备和较短的时间跨度来说效果很好,但在实际使用案例中,我可能拥有数千个设备和较长的时间跨度。

所以我的问题是如何在 PostgreSQL 9.4.4 中完成这一切,以便我的查询仅返回 10 个最耗电的(device_id、power_conspiration)对?

示例表:

CREATE TABLE measurements (
  id         serial primary key,
  device_id  integer,
  power      real,
  created_at timestamp
);

简单数据示例:

| id | device_id | power |               created_at |
|----|-----------|-------|--------------------------|
|  1 |         1 |    10 | August, 26 2015 08:23:25 |
|  2 |         1 |    13 | August, 26 2015 08:24:25 |
|  3 |         1 |    12 | August, 26 2015 08:25:25 |
|  4 |         2 |   103 | August, 26 2015 08:23:25 |
|  5 |         2 |   134 | August, 26 2015 08:24:25 |
|  6 |         2 |     2 | August, 26 2015 08:25:25 |
|  7 |         3 |    10 | August, 26 2015 08:23:25 |
|  8 |         3 |    13 | August, 26 2015 08:24:25 |
|  9 |         3 |    20 | August, 26 2015 08:25:25 |

想要的查询结果:

| id | device_id | power_consumption |
|----|-----------|-------------------|
|  1 |         1 |              24.0 |
|  2 |         2 |             186.5 |
|  3 |         3 |              28.0 |

我如何计算 kWh 值的简化示例(以小时为单位创建):

data = [
    [
        { 'id': 1, 'device_id': 1, 'power': 10.0, 'created_at': 0 },
        { 'id': 2, 'device_id': 1, 'power': 13.0, 'created_at': 1 },
        { 'id': 3, 'device_id': 1, 'power': 12.0, 'created_at': 2 }
    ],
    [
        { 'id': 4, 'device_id': 2, 'power': 103.0, 'created_at': 0 },
        { 'id': 5, 'device_id': 2, 'power': 134.0, 'created_at': 1 },
        { 'id': 6, 'device_id': 2, 'power': 2.0, 'created_at': 2 }
    ],
    [
        { 'id': 7, 'device_id': 3, 'power': 10.0, 'created_at': 0 },
        { 'id': 8, 'device_id': 3, 'power': 13.0, 'created_at': 1 },
        { 'id': 9, 'device_id': 3, 'power': 20.0, 'created_at': 2 }
    ]
]

# device_id: power_consumption
results = { 1: 0, 2: 0, 3: 0 }

for d in data:
    for i in range(0, len(d)):
        if i < len(d)-1:
            # Area between two records gives us kWh
            # X-axis is time(h)
            # Y-axis is power(kW)
            x1 = d[i]['created_at']
            x2 = d[i+1]['created_at']
            y1 = d[i]['power']
            y2 = d[i+1]['power']
            # Area between two records gives us kWh
            # X-axis is time(h)
            # Y-axis is power(kW)
            x1 = d[i]['created_at']
            x2 = d[i+1]['created_at']
            y1 = d[i]['power']
            y2 = d[i+1]['power']

            results[d[i]['device_id']] += ((x2-x1)*(y2+y1))/2

print results

编辑:检查this https://stackoverflow.com/questions/32254431/how-to-optimize-sql-query-with-window-functions看看我最终是如何解决这个问题的。


为此,您需要的一些元素是:

  1. Sum() 聚合,计算多条记录的总和
  2. Lag()/Lead() 函数,用于计算给定记录的“上一个”或“下一个”记录的值。

因此,对于给定的行,您可以获取当前的created_at和power记录,在SQL中,您可能会使用Lead()窗口函数来获取具有下一个最高值的同一设备id的记录的created_at和power记录对于created_at。

Lead() 的文档在这里:http://www.postgresql.org/docs/9.4/static/functions-window.html http://www.postgresql.org/docs/9.4/static/functions-window.html

当您通过引用“下一个”记录计算每一行的功耗时,您可以使用 Sum() 来汇总该设备的所有计算功率。

当您计算出每个设备的功耗后,您可以使用 ORDER BY 和 LIMIT 选择前 n 个功耗设备。

如果您没有信心直接编写最终的 SQL,请遵循以下步骤 - 在每个步骤之后,请确保您拥有理解的 SQL,并且它仅返回您需要的数据:

  1. 从小处开始,选择所需的数据行。
  2. 计算出 Lead() 函数,定义适当的分区和顺序子句以获得下一行。
  3. 添加每行功率的计算。
  4. 定义 Sum() 函数,并按设备 id 进行分组。
  5. 添加 ORDER BY 和 LIMIT 子句。

如果您在执行这些步骤中的任何一个时遇到困难,它们都会提出一个不错的 StackOverflow 问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据用电记录计算用电量? 的相关文章

  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • Postgres where 子句比较时间戳

    我有一个表 其中列的数据类型timestamp 其中包含一天的多条记录 我想选择与日期对应的所有行 我该怎么做 Assuming you actually mean timestamp because there is no datetim
  • 显示包含特定表的所有数据库名称

    我的 SQL Server 中有很多数据库 我必须只搜索包含特定表名的数据库名称Heartbitmaster 我有很多数据库 例如Gotgold DVD等 我只想从包含此表的查询中查找数据库名称Heartbitmaster 我搜索我尝试查询
  • T-SQL 中是否有 LIKE 语句的替代方案?

    我有一个场景我需要执行以下操作 SELECT FROM dbo MyTable WHERE Url LIKE
  • 如何从 postgresql 函数或触发器发送一些 http 请求

    我需要通过 http 协议 GET 或 POST 请求 从函数或触发器发送数据 是否可以 您可以尝试用 PL Python 编写触发器并使用 urllib2 进行 POST
  • 对 postgresql 中使用 array_agg 创建的文本聚合进行排序

    我在 postgresql 中有一个表 下表 动物 可以解释我的问题 name tiger cat dog 现在我正在使用以下查询 SELECT array to string array agg name FROM animals 结果是
  • 交换 ms-sql 表

    我想以尽可能最好的方式交换到桌子 我有一个 IpToCountry 表 并根据导入的外部 CSV 文件每周创建一个新表 我发现进行切换的最快方法是执行以下操作 sp rename IpToCountry IpToCountryOld go
  • Oracle内置函数元数据

    有没有办法获取 Oracle 内置聚合和其他功能的元数据 例如AVG STDDEV SQRT ETC 我需要知道对象 id 和参数元 In the SYS ALL OBJECTS查看我找不到任何有用的东西 我也尝试过搜索SYS ALL AR
  • 获取一组记录之间的时间差

    我有一个具有以下结构的表 ID ActivityTime Status 19 2013 08 23 14 52 1 19 2013 08 23 14 50 1 19 2013 08 23 14 45 2 19 2013 08 23 14 3
  • 在 Access 数据库中对列包含数字和字母的数据进行排序

    请帮助我 因为我一直无法做到这一点 选择此列 columnA 的访问 SQL 是什么 以便它返回一个结果集 其中的不同值首先根据数字排序 然后根据字母排序 这是列值 10A 9C 12D 11G 9B 10C 9R 8T 我尝试过 从 tb
  • 无重复组合的交叉连接

    我知道这个问题与这个问题非常相似 对称交叉连接 https stackoverflow com questions 12490244 symmetric cross join还有这个 sql 中交叉连接的组合 不是排列 https stac
  • 如何从 SQL Server 中的 SELECT 进行更新?

    In SQL服务器 可以将行插入到带有INSERT SELECT陈述 INSERT INTO Table col1 col2 col3 SELECT col1 col2 col3 FROM other table WHERE sql coo
  • 随机数据库与 AWS 中的 Django 和 Postgresql 断开连接

    我试图找出 Django 和数据库连接错误问题的根源 此时 我正在调试提示 因为我认为症状太不具体 一些背景 我一直在使用这个堆栈 在 AWS 中部署了很多年 没有出现任何问题 Ubuntu 在本例中为 20 04 LTS Nginx Uw
  • postgresql 中的锁定表

    我有一个名为 games 其中包含一个名为 title 该列是唯一的 数据库中使用PostgreSQL 我有一个用户输入表单 允许他插入新的 game in games 桌子 插入新游戏的功能会检查之前输入的游戏是否存在 game 与相同的
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • PostgreSQL 仅当列存在时才重命名该列

    我在中找不到PostgreSQL 文档 https www postgresql org docs 12 sql altertable html如果有办法运行 ALTER TABLE tablename RENAME COLUMN IF E
  • 如何使用sql脚本更改列的属性

    如何使用 sql 脚本更改列的属性 这是我尝试过但出现错误的方法 ALTER TABLE dbo tblBiometricPattern COLUMN BiometricPatternID TINYINT NOT NULL IDENTITY
  • Oracle - 获取星期几

    今天是星期二 为什么当我运行这个 SQL 语句时 它说今天不是星期二 SELECT CASE WHEN TO CHAR sysdate Day Tuesday THEN Its Tuesday ELSE Its Not Tuesday EN
  • 每行中非空列的计数

    我有一个包含 4 列的表 在第 5 列中我想存储前 4 列中有多少个非空列的计数 例如 其中 X 是任意值 Column1 Column2 Column3 Column4 Count X X NULL X 3 NULL NULL X X 2
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90

随机推荐

  • 如何使用“git submodule”查看子模块的特定版本?

    我该如何为特定标签或提交添加 Git 子模块 子模块存储库保持指向特定提交的分离 HEAD 状态 更改该提交只需检查不同的标签或提交 然后将更改添加到父存储库 cd submodule git checkout v2 0 Previous
  • .NET 4 中的 Math.Round() 行为[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中 Math Round 2 5 结果是 2 而不是 3 你在开玩笑吧 https stackoverflow com questions 977796 in c math round2 5
  • 如何更改弹出菜单中所选项目的颜色?

    我已经设置了背景颜色和文本颜色以及一些其他颜色属性 例如禁用和未选择的颜色 但似乎都没有更改所选项目的背景颜色 如果我必须更改以下属性才能使其看起来像我想要的那样 或者我需要在我的代码中添加什么 我有以下内容
  • 使用 ARM NEON 内在函数添加 alpha 和排列

    我正在开发一个 iOS 应用程序 需要相当快地将图像从 RGB gt BGRA 转换 如果可能的话 我想使用 NEON 内在函数 有没有比简单分配组件更快的方法 void neonPermuteRGBtoBGRA unsigned char
  • CSS:如何让此覆盖层随着滚动延伸 100%?

    以下是所讨论问题的示例 http dev madebysabotage com playground overlay html http dev madebysabotage com playground overlay html 您会看到
  • Jquery 匹配值

    您好 我正在尝试执行 if 语句来查看数组中的值是否完全匹配 然后我希望它的同级元素能够显示精确匹配的 html 有人可以帮忙吗 我使用 TWIG 作为高级自定义字段 Wordpress 插件的 HTML 我只想说一次的所有地点的图片以及它
  • 在 C# 应用程序中写入注册表

    我正在尝试使用我的 C 应用程序写入注册表 我正在使用这里给出的答案 使用 C 将值写入注册表 https stackoverflow com questions 1660870 writing values to the registry
  • UIWebView 在 iOS9 上不显示图像,SafariViewController 根本不加载 HTML 文件?

    刚刚发现UIWeb视图加载嵌入图像的 HTML 字符串无法正常显示图像iOS9 转基因种子 之前工作正常iOS8 观看 WWDC SafariViewController 视频后here https developer apple com
  • AttributeError:“模块”对象(scipy)没有属性“misc”

    我从 ubuntu 12 04 更新到 ubuntu 12 10 我编写的 python 模块突然不再工作 并出现错误消息 模块 scipy 没有属性 misc 这以前有效 更新后我仍在使用python 2 7 这是代码崩溃的地方 impo
  • JavaFX 在控件中显示属性

    我正在学习 Oracle 的 JavaFX 教程 使用 Swing 多年 很久以前 后 我对新的智能功能很着迷 包括 特性 我很惊讶地看到这些例子 例如 https docs oracle com javafx 2 ui controls
  • WPF 窗口位置

    我之前问过一个关于创建子窗口的问题here https stackoverflow com questions 5851833 c wpf child window about window 现在 当我打开子窗口时 它不会以父窗口为中心打开
  • Encoding.GetEncoding(437).GetString() 错误?

    我有以下测试程序 char c Debug WriteLine c int c byte b Encoding GetEncoding 437 GetBytes 0 Debug WriteLine b b char c1 Encoding
  • 如何对每列应用不同函数的数据框进行重新采样?

    我有一个熊猫温度和辐射的时间序列dataframe 时间分辨率按常规步长为 1 分钟 import datetime import pandas as pd import numpy as np date times pd date ran
  • 如何将plotly Express绘图保存到html或静态图像文件中?

    然而 我觉得用plotly express 保存这个数字是相当棘手的 如何将plotly express或plotly绘图保存到单独的html或静态图像文件中 有人可以帮忙吗 更新的答案 使用新版本的plotly Python 中的静态图像
  • 如何将 FastMM 添加到 C++ Builder 项目?

    我正在尝试配置FASTMM4 for Builder C 6我遵循的步骤是 下载的 zip 文件来自来源锻造 http sourceforge net projects fastmm 在下面Project gt Options gt Lin
  • Mysql 选择行的总和

    我有一张包含以下信息的表 id Item ID stock package id amount price 0 775 1 16 0 22 1 758 2 10 0 28 2 775 3 10 0 30 3 774 4 10 0 25 4
  • 远程模式 RoR 中的 jQuery UI 自动完成

    我正在尝试实施jquery ui autocomplete在我的远程模式中 它不起作用 而autocomplete适用于常规静态页面 对于远程模式 我使用 gem 的组合 模态响应器轨道 https github com Sento mod
  • xdt:Transform="Insert" 不适用于 中的

    我在 web config 的实时配置中编写了以下转换
  • Altair 为交互式散点图罐添加日期滑块

    有人尝试过使用日期作为 Altair 交互式散点图的滑块吗 我正在尝试重现与 gapminder 散点图类似的图 1 我尝试使用日期而不是年份过滤器 例如 2020 01 05 并出现以下错误 altair vegalite v4 sche
  • 如何根据用电记录计算用电量?

    我有一个表格 其中包含设备的功率值 kW 每分钟从每个设备读取一次值 并将其插入带有时间戳的表中 我需要做的是计算给定时间跨度的功耗 kWh 并返回 10 个最耗电的设备 现在 我查询给定时间跨度的结果 并在后端循环所有记录中进行计算 这对