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很明显。蒂纳克斯