MySQL:在datetime范围内每小时获取最多计数的相同值项(统计模式)
我有一张这样的桌子:MySQL:在datetime范围内每小时获取最多计数的相同值项(统计模式),mysql,sql,datetime,subquery,Mysql,Sql,Datetime,Subquery,我有一张这样的桌子: +--------+---------+----------------------+--------------+----------+ | idadata | value_r | date_r | idparameter | idnode | +--------+-----------+-----------------------+--------------+--------+ | 54620 | 66.6627 | 2014
+--------+---------+----------------------+--------------+----------+
| idadata | value_r | date_r | idparameter | idnode |
+--------+-----------+-----------------------+--------------+--------+
| 54620 | 66.6627 | 2014-10-16 12:01:09 | 46 | 9 |
| 54621 | 19.4953 |2014-10-16 12:01:09 | 40 | 9 |
| 54622 | 19.9384 |2014-10-16 12:01:09 | 47 | 9 |
| 54623 | 163.849 | 2014-10-16 12:01:09 | 43 | 9 |
| 54624 | 67.9257 | 2014-10-16 12:02:09 | 44 | 9 |
| 54625 | 315 | 2014-10-16 12:02:09 | 42 | 9 |
| 54626 | 0.699 | 2014-10-16 12:02:09 | 41 | 9 |
| 54627 | 67.9257 | 2014-10-16 12:03:09 | 46 | 9 |
| 54628 | 19.2308 | 2014-10-16 12:03:09 | 40 | 9 |
| 54629 | 11.207 | 2014-10-16 12:03:09 | 47 | 9 |
| 54630 | 118.743 | 2014-10-16 12:03:09 | 43 | 9 |
| 54631 | 292.5 | 2014-10-16 12:03:09 | 42 | 9 |
+---------+----------+----------------------+---------------+-------+
+----------+----------------------+---------------+
| value_r | date_r | max(counter_v)|
+-----------+----------------------+--------------+
| 270 | 2014-10-16 12:00:00 | 7 |
+-----------+-----------------------+--------------+
| 90 | 2014-10-16 13:00:00 | 4 |
+-----------+-----------------------+--------------+
| 45 | 2014-10-16 14:00:00 | 9 |
+-----------+-----------------------+--------------+
| 180 | 2014-10-16 15:00:00 | 8 |
+-----------+-----------------------+--------------+
我需要获得统计模式或值\u r
,该值在给定的idparameter
和idnode
中每小时重复次数最多。当我手动将日期时差设置为1小时时,我成功地获得了模式。然而,当我尝试按小时或时差分组时,它不起作用,我最终使用整个开始-结束日期时间模式,而不是按小时分组
到目前为止,这是我的代码:
select value_r , date_r , max(counter_v) from
(SELECT iddata, value_r,date_r ,count( value_r ) counter_v
FROM wsnca.data dat
where dat.idnode=9 and dat.idparameter=42 and
( dat.date_r between ('2014-10-16 12:00:00') and ('2014-10-16 13:00:00') )
group by value_r
order by counter_v DESC) T;
结果:
+----------+----------------------+---------------+
| value_r | date_r | max(counter_v)|
+-----------+----------------------+--------------+
| 270 | 2014-10-16 12:03:09 | 7 |
+-----------+-----------------------+--------------+
然而,我想要的结果是:
+--------+---------+----------------------+--------------+----------+
| idadata | value_r | date_r | idparameter | idnode |
+--------+-----------+-----------------------+--------------+--------+
| 54620 | 66.6627 | 2014-10-16 12:01:09 | 46 | 9 |
| 54621 | 19.4953 |2014-10-16 12:01:09 | 40 | 9 |
| 54622 | 19.9384 |2014-10-16 12:01:09 | 47 | 9 |
| 54623 | 163.849 | 2014-10-16 12:01:09 | 43 | 9 |
| 54624 | 67.9257 | 2014-10-16 12:02:09 | 44 | 9 |
| 54625 | 315 | 2014-10-16 12:02:09 | 42 | 9 |
| 54626 | 0.699 | 2014-10-16 12:02:09 | 41 | 9 |
| 54627 | 67.9257 | 2014-10-16 12:03:09 | 46 | 9 |
| 54628 | 19.2308 | 2014-10-16 12:03:09 | 40 | 9 |
| 54629 | 11.207 | 2014-10-16 12:03:09 | 47 | 9 |
| 54630 | 118.743 | 2014-10-16 12:03:09 | 43 | 9 |
| 54631 | 292.5 | 2014-10-16 12:03:09 | 42 | 9 |
+---------+----------+----------------------+---------------+-------+
+----------+----------------------+---------------+
| value_r | date_r | max(counter_v)|
+-----------+----------------------+--------------+
| 270 | 2014-10-16 12:00:00 | 7 |
+-----------+-----------------------+--------------+
| 90 | 2014-10-16 13:00:00 | 4 |
+-----------+-----------------------+--------------+
| 45 | 2014-10-16 14:00:00 | 9 |
+-----------+-----------------------+--------------+
| 180 | 2014-10-16 15:00:00 | 8 |
+-----------+-----------------------+--------------+
如前所述,我不知道如何按一小时的时间间隔将其分组,并在所需表中的小时日期时间读取查询轮
我知道我可以在PHP中进行多个查询,但更愿意在一个查询中进行。将
按值分组\u r
更改为按值分组,日期\u r
,我认为这应该可以实现
编辑为您想要实现的目标提供更好的响应
select value_r , DATE_FORMAT(date_r, '%Y-%m-%d %H') as formatted_date, max(counter_v) from
(SELECT iddata, value_r,date_r ,count( value_r ) counter_v
FROM wsnca.data dat
where dat.idnode=9 and dat.idparameter=42 and
( dat.date_r between ('2014-10-16 12:00:00') and ('2014-10-16 13:00:00') )
group by value_r, formatted_date
order by counter_v DESC) T
您可以对每小时的
值\u r
计数进行编号,最高计数从#1开始,第二高计数从#2开始,依此类推,然后仅保留#1行,这将是每小时的模式
select date_hour, value_r, cnt from (
select * ,
@rowNum := IF(date_hour = @prevDateHour,@rowNum+1,1) rowNum,
@prevDateHour := date_hour
from (
select value_r, hour(date_r) date_hour, count(*) cnt
from wsnca.data dat
where dat.idnode=9 and dat.idparameter=42
group by value_r, hour(date_r)
) t1 order by date_hour, cnt desc
) t1 where rowNum = 1
您的外部
max(counter\u v)
语句只返回一行。我修改它以显示日期时间,并限制where子句中的日期范围以及order by子句中的“date\u year,date\u month,date\u day”。对于较小的日期差异,它的工作方式令人愉快,但一旦(EndDate StartDate)变大,计数就会计算错误,并且相同情况下的模式与实际模式不匹配。猜猜这是为什么?非常感谢。@AndresJ尝试将hour(date\r)
的两个实例替换为date\u格式(date\r,“%Y-%m-%d%H”)
我发现错误:#1054-PhpMyAdmin中“group statement”中的未知列“formatted_date”。我理解您的想法,我喜欢它,但当它不在Workbench中执行时,PhpMyAdmin也不会执行,因为格式化的_date很明显。蒂纳克斯