MySQL获取最小/最大值以及按小时,天,月等分组的相应日期/时间字段

时间:2012-10-05 06:10:23

标签: mysql group-by sql-order-by max min

我试图在这里和其他论坛找到上述答案。

给出一个有价值的表格

  • ID:somevalues:date_time
  • 1:50:2012-10-05 13:00:00
  • 2:45:2012-10-05 13:15:00
  • 3:35:2012-10-05 13:20:00
  • 4:20:2012-10-05 15:00:00
  • 5:45:2012-10-05 15:25:00
  • 6:35:2012-10-05 15:35:00

等等,您如何找到最小值和最大值以及按小时,日,月等分组的相应日期和时间。

这里的问题是SQL组中的GROUP只有小时和IN MYSQL,它将返回集合或表中出现的第一个日期时间。我知道其他RDBMS的实现方式不同。因此,我使用ORDER BY来首先对表进行排序,这样当我们运行查询时,值按升序和降序排序,对应于最小和最大查询,这样当我们选择每小时的最小值和最大值时,第一个日期 - 查询选择的时间是与最小值或最大值相关的时间。

下面给出了每小时拉出最小值和最大值的查询,

SELECT 
        * 
FROM(
    SELECT 
        HOUR(DATE_TIME) AS MINHOUR, 
        MIN(SOMEVALUES) AS  MINVALUES, 
        DATE_TIME AS MINDATETIME FROM (SELECT * FROM VALUETABLE
    WHERE DATE_TIME>'2012-10-05 00:00:00' 
    AND DATE_TIME<'2012-10-05 23:59:59' 
    ORDER BY SOMEVALUES
    ) AS TEMPT1 
    GROUP BY HOUR(DATE_TIME)
    ) AS    MINVALTABLE 
LEFT JOIN (
    SELECT 
        HOUR(DATE_TIME) AS MAXHOUR,
        MAX(SOMEVALUES) AS MAXVALUES, 
        DATE_TIME AS MAXDATETIME FROM 
        (
            SELECT 
                *
            FROM VALUETABLE 
            WHERE DATE_TIME>'2012-10-05 00:00:00' 
            AND DATE_TIME<'2012-10-05 23:59:59' 
            ORDER BY SOMEVALUES DESC
        ) AS TEMPT2
GROUP BY HOUR(DATE_TIME)) AS MAXVALTABLE 
ON  MINVALTABLE.MINHOUR=MAXVALTABLE.MAXHOUR;

查询应该按此处输出,

  • MINHOUR | MINVALUES | MINDATETIME | MAXHOUR | MAXVALUES | MAXDATETIME
  • 13 | 35 | 2012-10-05 13:20:00 | 13 | 50 | 2012-10-05 13:00:00
  • 15 | 20 | 2012-10-05 15:00:00 | 15 | 45 | 2012-10-05 15:25:00

请告诉我,如果我错过了什么,或者是否有更好的方法可以做到这一点。

据我了解,查询可以类似地用于按天,月等分组。

1 个答案:

答案 0 :(得分:0)

尝试此查询以获得最大值

SELECT
    t.id,
    DATE_FORMAT(lt.datetime, '%H') as Hour,
    DATE_FORMAT(lt.datetime, '%d') as Day,
    DATE_FORMAT(lt.datetime, '%m') as Month
FROM table as t
LEFT JOIN (SELECT MAX(id),datetime FROM table)  as lt ON lt.id = t.id
GROUP BY Month , Day , Hour

如果不是您想要的,请清除您的问题