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 |
+------------+---------------+---------+----------+----------+
每天可能有多次启动和关机,但我对第一次启动和上次关机感到满意。 我可以通过查找生成值从< 2到> 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”的“分组依据”条款。 显然我是一个SQL菜鸟。
所以我的问题是如何组合查询(或者可能提出完全不同的策略)来实现预期的结果? 查询将从PHP脚本执行,我已经考虑使用PHP来检测启动和关闭时间并将它们添加到响应中,但我更愿意先耗尽所有SQL选项。
非常感谢您提供的任何提示。
答案 0 :(得分:0)
解决了!我一直在寻找没有必要的复杂性,在这种情况下,连接是完全没有必要的,但是沿着那条路走下去,我对显而易见的事情视而不见。简单的查询是
select date(DispatchInterval) as RunDate, max(Generation) as MaxGeneration,
sum(Generation)/12 as MWH,
time(min(DispatchInterval)) as StartUp,
time(max(DispatchInterval)) as Shutdown
from GenerationData group by RunDate desc
+------------+---------------+------------+----------+----------+
| RunDate | MaxGeneration | MWH | StartUp | Shutdown |
+------------+---------------+------------+----------+----------+
| 2014-02-02 | 499.875 | 1025.375 | 00:00:00 | 15:10:00 |
| 2014-01-28 | 494.25 | 4334.125 | 00:00:00 | 23:55:00 |
| 2014-01-27 | 506.25 | 3032.5625 | 00:00:00 | 23:55:00 |
| 2014-01-17 | 466.5 | 6178.75 | 00:00:00 | 23:55:00 |
| 2014-01-16 | 500.625 | 7733.71875 | 00:00:00 | 23:55:00 |
+------------+---------------+------------+----------+----------+
有时候你只需要离开并做一些其他事情。