MySQL:在日期时间范围内每小时获得计数最多的同值条目(统计模式)

时间:2014-11-07 17:56:52

标签: mysql sql datetime subquery

我有一张这样的表:

+--------+---------+----------------------+--------------+----------+
| 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每小时在给定的datime间隔内对给定idparameteridnode重复最多的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; 。当我手动设置1小时的日期时间差异时,我设法获得了模式。但是,当我尝试按小时或时差分组时,它不起作用,我最终得到整个开始 - 结束日期时间的模式,而不是按小时分组。

到目前为止,这是我的代码:

+----------+----------------------+---------------+
| value_r   | date_r               | max(counter_v)|
+-----------+----------------------+--------------+
| 270       | 2014-10-16 12:03:09  |    7          |
+-----------+-----------------------+--------------+

结果:

+----------+----------------------+---------------+
| 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          |
+-----------+-----------------------+--------------+

然而,我正在寻找的结果是这样的:

{{1}}

正如我之前所说,我不知道如何按一小时的时间间隔对其进行分组,并在小时日期时间内从查询回合中读取所需的表格。

我知道我可以在PHP中执行多个查询,但更愿意在一个查询中执行此操作。

2 个答案:

答案 0 :(得分:1)

您可以为每小时value_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

答案 1 :(得分:0)

group by value_r更改为group by value_r, date_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
相关问题