2016-04-14 10 views
2

列のMAX値を使用して同じ列の他のすべてのレコードを計算するための適切な構文は何ですか?MySQL - 同じ列のすべてのレコードに対して計算する列の最大値

私が指定した例では、variableData列のMAXはweightedDataの結果が10であるため、レコードごとに戻ります。レコードの

、私は私の例に設けられていることの表heatMapDataは、4列からなる:

  1. ユニークID - VARCHAR(255)
  2. 緯度 - DECIMAL(8,6)
  3. 経度 - DECIMAL(9,6)
  4. variableData - ここDECIMAL(17,2)

答えて

1

JOINおよびを利用する方法であります最大値を維持するためにMAX()が1回だけ実行されることを保証するためにを使用してください。

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以外のデータベースによっては、中に含まれていないSELECTリスト内の非集計表現のために、文でエラーをスローし、代替として

GROUP BY。 GROUP BYの動作にMySQL特有の拡張機能を使用すると、クエリを実行できますが、ONLY_FULL_GROUP_BYをsql_mode変数に追加することで、MySQLを標準に近づけ(エラーをスローする)ことができます。

+0

Well Noted。ユーザー定義変数を持たない方が望ましい理由についてコメントできますか?なぜ私は仮定していますが、仮定するよりも明確にすることができればそれが良いと信じています。 –

+1

ユーザ定義の変数パターンはMySQL固有のものなので、このように記述されたSQLは、他のデータベースと同様に移植性がありません。また、ユーザー定義変数の値はセッション・レベルで定義され、アクセス時に評価されます。例えば関数を書く場合、変数の値を変更するfooの場合、SQL文で関数を使用すると、SELECTリストの式が評価されるときに変数が各行に対して同じ値を持つという保証はありません。また、ユーザー定義変数は特定のデータ型ではなく文字列として格納されます。 – spencer7593

+0

もう一度よく指摘!ありがとうございました! –

関連する問題