更高效的查询MYSQL

时间:2017-08-28 16:32:14

标签: mysql datetime aggregate-functions

我有这样的数据表

Table 1

Field1   Field2 Field3
00:00:01 Test1 10.0
00:00:01 Test2 7.3
00:00:01 Test3 11.03
00:00:10 Test1 11.0
00:00:10 Test2 17.3
00:00:10 Test3 15.03
01:00:01 Test1 5.0
01:00:01 Test2 4.3
01:00:01 Test3 4.03
01:00:10 Test1 5.0
01:00:10 Test2 4.3
01:00:10 Test3 4.03
02:00:01 Test1 78.0
02:00:01 Test2 43.3
02:00:01 Test3 19.03
02:00:10 Test1 79.0
02:00:10 Test2 46.3
02:00:10 Test3 14.03

我需要使用以下查询每小时Iam的最大值,但我希望有时更有效地保存在其他表中

INSERT INTO table2 (Time, TYPE, Number)
SELECT Field1, Field2, max(Field3)
  FROM table1
 WHERE Field1 like '00:%' ;
INSERT INTO table2 (Time, TYPE, Number)
SELECT Field1, Field2, max(Field3)
  FROM table1
 WHERE Field1 like '01:%' ;
INSERT INTO table2 (Time, TYPE, Number)
SELECT Field1, Field2, max(Field3)
  FROM table1
 WHERE Field1 like '02:%' ;

..............
..............
to '23:%'

3 个答案:

答案 0 :(得分:0)

您可以使用WHERE NOT EXISTS子句。

SELECT Field1 as hr, Field2 as name, Field3 as num
  FROM table1 orig
 WHERE NOT EXISTS (
    SELECT 1 
      FROM table1 lower 
     WHERE lower.Field3 > orig.Field3
       AND lower.Field1 = orig.Field1
  )

所以基本上你说'#34;只给我一行,其他行没有相同的小时和更高的数字" - 假设您有适当的索引,这将是一个非常有效的查询。

我还建议您使用比field1,table1等更好的名称

我只剩下SELECT语句 - 将其包装在INSERT语句或其他任何需要的内容中。

答案 1 :(得分:0)

如果我正确理解您的查询,您希望在Field3表格中显示的每小时插入与table1相关的最大记录。如果是这样,那么您可以取消所有这些insert语句并将其替换为单个insert语句。这个单一语句使用子查询来识别您想要插入的所有记录,每个小时一次,一次性。

INSERT INTO table2 (Time, TYPE, Number)
SELECT
    t1.Field1,
    t1.Field2,
    t1.Field3
FROM table t1
INNER JOIN
(
    SELECT HOUR(Field1) AS max_time, MAX(Field3) AS max_field3
    FROM table1
    GROUP BY HOUR(Field1)
) t2
    ON HOUR(t1.Field1) = t2.max_time AND
       t1.Field3       = t2.max_field3

请注意,如果您的表中有多个日期,那么按小时进行聚合可能有点奇怪。相反,您可能希望使用四舍五入到整个小时的整个日期进行汇总。

答案 2 :(得分:0)

您需要GROUP BY TruncToHour(Field)来实现这一目标。诀窍是实现TruncToHour(),您可以这样做:

   TIME(TIME_FORMAT( Field1, '%H:00:00'))

这会获取每一行中的时间值并剥离分钟和秒,将其替换为零。

使用它,您将获得此SELECT查询(http://sqlfiddle.com/#!9/a50405/5/0

     SELECT TIME(TIME_FORMAT( Field1, '%H:00:00')) Field1, 
            Field2, MAX(Field3) Field3
       FROM table1
      GROUP BY TIME(TIME_FORMAT( Field1, '%H:00:00'), Field2

然后,您可以在INSERT语句中使用该结果集。

如果要查找table1中与每小时field3的最大值对应的详细信息行,则需要使用上述查询作为子查询的嵌套查询。像这样。 (http://sqlfiddle.com/#!9/a50405/16/0

这使用一个查询模式,在每个GROUP BY组中找到MAX值,然后将其连接回原始表,以查找MAX值来自的详细信息行。

 SELECT a.Field1, a.Field2, a.Field3
   FROM table1 a
   JOIN (
         SELECT TIME(TIME_FORMAT( Field1, '%H:00:00')) Field1, 
                Field2, MAX(Field3) Field3
           FROM table1
          GROUP BY TIME(TIME_FORMAT( Field1, '%H:00:00')), Field2                        
        ) b ON TIME(TIME_FORMAT( a.Field1, '%H:00:00')) = b.Field1
           AND a.Field2=b.Field2         
           AND a.Field3=b.Field3