2017-08-28 98 views
1

我有数据表这样更高效的查询MYSQL

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 

我使用下面的查询需要每个小时荫的最大价值,但我找了一段时间更高效的在其他表保存

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:%' 

回答

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 
) 

所以基本上你说“只给我没有其他行具有相同的时间和更高的数行” - 这将是一个非常有效的查询假设你有相应的索引。

我也建议你比字段1,表1更好的名字,等

我只剩下了SELECT声明 - 包装在一个INSERT语句或其他任何你需要的。

0

如果我正确理解您的查询,您希望从table1表中出现的每个小时插入关于Field3的最大记录。如果是这样,那么你可以做掉了所有这些插入语句,并用一个单一的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 

注意,这可能是一个有点奇怪按小时,如果你有在你的表中的多个日期只能做一个汇总。相反,你可能想使用四舍五入至小时的顶部整个日期聚集。

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语句设置。

如果您正在寻找与每个小时的field3的最大值对应的table1的详细信息行,则需要使用上面的查询作为子查询的嵌套查询。像这样。 (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