2017-08-28 117 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