2016-04-14 13 views
2

Aynı sütundaki diğer tüm kayıtlara karşı hesaplamak için bir sütundaki MAX değerini kullanmak için uygun sözdizimi nedir? Ben sağladı örnek ileMySQL - Aynı Sütundaki TÜM kayıtlara karşılık hesaplanacak Sütun Maksimum Değeri

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

ben weightedData için 10 Bir sonuç olarak variableData her kayıt için kendini geri sütunun MAX. Kayıt için

, benim örnekte verilen tablo heatMapData 4 sütun oluşmaktadır:

  1. uniqueID - VARCHAR (255)
  2. enlem - decimal (8,6)
  3. boylam - Ondalık (9,6)
  4. variableData - decimal (17,2)
  5. Burada

cevap

1

JOIN vekullanan bir yöntemdir Maksimum değeri korumak için, MAX()'un yalnızca bir kez yürütüldüğünü garanti eder.

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

Bu, mükemmel çalışır! Teşekkür ederim! –

1

Kullanıcı tanımlı bir değişken (seçilen yanıtta gösterildiği gibi) gerekli değildir. Bir alternatif olarak

:

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 

NOT: MySQL dışındaki

bazı veritabanları nedeniyle yer almayan SEÇ listesinde olmayan agrega ifadelere, ifadesiyle bir hata atardı GROUP BY. GROUP BY davranışına MySQL'e özgü bir uzantı, sorgunun çalışmasına izin verir, ancak MySQL'in sql_mode değişkenine ONLY_FULL_GROUP_BY ekleyerek standarda daha fazla uyum sağlamasını (ve bir hata atmasını) sağlayabiliriz.

+0

İyi Not. Kullanıcı tanımlı bir değişkenin olmamasının neden tercih edileceği üzerine yorum yapabilir misiniz? Benim varsayımlarım var, ama varsayımdan ziyade açıklığa kavuşursanız daha iyi olabileceğine inanıyorum. –

+1

Kullanıcı tanımlı değişken modeli MySQL'e özgüdür, bu nedenle SQL bu şekilde yazılmış diğer veritabanlarına taşınabilir değildir. Ayrıca, kullanıcı tanımlı bir değişkenin değeri, oturum seviyesinde tanımlanır ve erişildiğinde değerlendirilir. Eğer bir fonksiyon yazsaydık ör. Değişkenin değerini değiştiren foo, eğer SQL deyimindeki işlevi kullanırsak, SELECT listesindeki ifade değerlendirildiğinde değişkenin her satır için aynı değere sahip olacağının bir garantisi yoktur. Kullanıcı tanımlı değişkenler, belirli bir veri türü olarak değil, dizeler olarak depolanır. – spencer7593

+0

Yine dikkat çekti! Teşekkür ederim! –

İlgili konular