2016-04-14 41 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

再次注意!谢谢! –

相关问题