【发布时间】:2026-02-08 14:40:01
【问题描述】:
MySQL 版本 15.1 Distrib 10.0.7-MariaDB,在 Debian-linux 上运行。
我正在将 5 分钟的发电数据收集到一个 MySQL 数据库中,并想修改一个日报 SQL 查询。 GenerationData 表中的典型天数数据如下所示:
--------++------------+---------------------+
| id | Generation | DispatchInterval |
+--------+------------+---------------------+
| 321888 | 0.0 | 2014-01-28 22:15:00 |
| 321887 | 0.0 | 2014-01-28 22:10:00 |
| 321886 | 72 .0 | 2014-01-28 22:05:00 |
| 321885 | 99.37 | 2014-01-28 22:00:00 |
. . .
. . .
| 321679 | 51.375 | 2014-01-28 10:50:00 |
| 321678 | 30.375 | 2014-01-28 10:45:00 |
| 321677 | 12 | 2014-01-28 10:40:00 |
| 321676 | 0.0 | 2014-01-28 10:35:00 |
| 321675 | 0.0 | 2014-01-28 10:30:00 |
+--------+------------+---------------------+
因此,每天有任何一代都会有 288 条记录,从“2014-01-28 00:00:00”开始,到“2014-01-28 23:55:00”结束,每条记录都有唯一的 id 和 Generation 读数(以及为清楚起见我已排除的其他一些字段)
我使用类似的查询创建每日生成报告
select date(DispatchInterval) as RunDate, max(Generation) as MaxGeneration,
sum(Generation)/12 as MWH
from GenerationData
group by date(DispatchInterval)
order by date(DispatchInterval) desc LIMIT 0, 4;
+------------+---------------+---------+
| RunDate | MaxGeneration | MWH |
+------------+---------------+---------+
| 2014-01-28 | 494.25 | 4334.12 |
| 2014-01-27 | 506.25 | 3032.56 |
| 2014-01-17 | 466.5 | 6178.75 |
| 2014-01-16 | 500.625 | 7733.72 |
+------------+---------------+---------+
我想要做的是扩展查询以包括每天的启动和关闭时间,例如:
+------------+---------------+---------+----------+----------+
| RunDate | MaxGeneration | MWH | Startup | Shutdown |
+------------+---------------+---------+----------+----------+
| 2014-01-28 | 494.25 | 4334.12 | 10:40:00 | 22:10:00 |
| 2014-01-27 | 506.25 | 3032.56 | 06:25:00 | 23:30:00 |
| 2014-01-17 | 466.5 | 6178.75 | 11:40:00 | 22:05:00 |
| 2014-01-16 | 500.625 | 7733.72 | 03:15:00 | 19:55:00 |
+------------+---------------+---------+----------+----------+
每天可能会有多次启动和关闭,但我会对第一次启动和最后一次关闭感到满意。 我可以通过查找 Generation 值从 2 的转换(以允许读数中的噪声)来获取启动或关闭时间(但不是使用相同的查询)
select date(a.DispatchInterval), time(b.DispatchInterval) as StartTime
from GenerationData a
join GenerationData b on
b.DispatchInterval=DATE_ADD(a.DispatchInterval,INTERVAL 5 MINUTE)
and b.Generation>2 and a.Generation<2
group by date(a.DispatchInterval)
order by date(a.DispatchInterval) desc limit 0,4
+--------------------------+---------------------+
| date(a.DispatchInterval) | StartTime |
+--------------------------+---------------------+
| 2014-01-28 | 10:40:00 |
| 2014-01-27 | 06:25:00 |
| 2014-01-15 | 06:00:00 |
| 2014-01-14 | 09:55:00 |
+--------------------------+---------------------+
但我对各种连接都没有运气,可能是因为“MWH”的“Group by”子句。 显然我是一个 SQL 菜鸟。
所以我的问题是如何组合查询(或者可能想出完全不同的策略)以达到预期的结果? 查询将从 PHP 脚本执行,我考虑使用 PHP 来检测启动和关闭时间并将它们添加到响应中,但我更愿意先用尽所有 SQL 选项。
如果您能提供任何提示,我们将不胜感激。
【问题讨论】:
-
您需要发布正确的示例数据,这些数据才能真正生成您发布的结果。仅放置 ... 是不够的。提供数据,让用户尝试
-
嗨,raheel,一整天包含 288 条记录,从 "yyyy-mm-dd 00:00:00" 到 "yyyy-mm-dd 23:55:00" - 要粘贴的内容很多而且我看不到任何附加文件的选项。 ... 表示确切的值并不重要,只是 DispatchInterval 增加 5 分钟,Generation 随时间上升和下降。