2016-04-14 40 views
2

使用列中的MAX值與同一列中的所有其他記錄進行計算的恰當語法是什麼?MySQL - 對同一列中的所有記錄計算的列的最大值

SELECT latitude,longitude,(variableData/MAX(variableData)) * 10 AS weightedData FROM heatMapData GROUP BY uniqueID; 

對於我提供的示例,列variableData的MAX正在爲每條記錄返回自身,因爲我對weightedData的結果爲10。

對於記錄,我在我的例子中提供的表heatMapData由4個列組成:

  1. UNIQUEID - VARCHAR(255)
  2. 緯度 - DECIMAL(8,6)
  3. 經度 - DECIMAL(9,6)
  4. variableData - DECIMAL(17,2)

回答

1

下面是一個使用JOIN和的方法保持最大值,保證MAX()只執行一次。

SELECT latitude,longitude,(variableData/@max_var_data) * 10 AS weightedData 
FROM heatMapData CROSS JOIN 
    (SELECT @max_var_data := (SELECT MAX(variableData) FROM heatMapData)) params 
GROUP BY uniqueID; 
+0

這完美的作品!謝謝! –

1

用戶定義的變量(如所選答案中所示)不是必需的。

作爲一種替代方案:

SELECT h.latitude 
    , h.longitude 
    , h.variableData/m.max_vd * 10 AS weightedData 
    FROM heatMapData h 
CROSS 
    JOIN (SELECT MAX(d.variableData) AS max_vd 
      FROM heatMapData d 
     ) m 
GROUP BY h.uniqueID 

注:

比MySQL其他一些數據庫將拋出一個錯誤with語句,由於不包含在SELECT列表中的非集合表達式通過...分組。 GROUP BY行爲的特定於MySQL的擴展允許查詢運行,但是我們可以通過將ONLY_FULL_GROUP_BY添加到sql_mode變量來使MySQL更符合標準(並引發錯誤)。

+0

注意了。你可以評論爲什麼它不會有用戶定義的變量嗎?我有我的假設爲什麼,但相信如果你能澄清而不是假設,它會更好。 –

+1

用戶定義的變量模式特定於MySQL,因此用這種方式編寫的SQL不像其他數據庫那樣可移植。另外,用戶定義變量的值在會話級別定義,並在訪問時進行評估。如果我們要寫一個函數,例如foo修改變量的值,如果我們在SQL語句中使用該函數,那麼當計算SELECT列表中的表達式時,不能保證該變量對於每一行都具有相同的值。用戶定義的變量作爲字符串存儲,而不是作爲特定的數據類型存儲。 – spencer7593

+0

再次注意!謝謝! –

相關問題