MySQL—针对同一列中的所有记录计算的列的最大值

MySQL—针对同一列中的所有记录计算的列的最大值,mysql,Mysql,使用列中的最大值来计算同一列中的所有其他记录的正确语法是什么 SELECT latitude,longitude,(variableData / MAX(variableData)) * 10 AS weightedData FROM heatMapData GROUP BY uniqueID; 在我提供的示例中,列variableData的MAX为每个记录返回它自己,因为我对weightedData的结果是10 对于记录,我在示例中提供的表格heatMapData由4列组成: uniqueI

使用列中的最大值来计算同一列中的所有其他记录的正确语法是什么

SELECT latitude,longitude,(variableData / MAX(variableData)) * 10 AS weightedData FROM heatMapData GROUP BY uniqueID;
在我提供的示例中,列variableData的MAX为每个记录返回它自己,因为我对weightedData的结果是10

对于记录,我在示例中提供的表格heatMapData由4列组成:

  • uniqueID-VARCHAR(255)
  • 纬度-十进制(8,6)
  • 经度-十进制(9,6)
  • 可变数据-十进制(17,2)

  • 这里是一种利用
    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;
    
    用户定义的变量(如所选答案所示)不是必需的

    作为替代方案:

    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
    
    注:


    由于SELECT列表中的非聚合表达式未包含在GROUP BY中,MySQL以外的一些数据库会抛出with语句错误。特定于MySQL的GROUP BY behavior扩展允许运行查询,但我们可以通过只向sql模式变量添加_FULL_GROUP_BY,使MySQL更符合标准(并抛出错误)。

    值得注意。你能评论一下为什么不建议使用用户定义的变量吗?我有我的假设,但我相信如果你能澄清而不是假设会更好。用户定义的变量模式是特定于MySQL的,因此以这种方式编写的SQL无法移植到其他数据库。此外,用户定义变量的值在会话级别定义,并在访问时进行评估。如果我们要编写一个函数(例如foo)来修改变量的值,如果我们在SQL语句中使用该函数,则无法保证在计算SELECT列表中的表达式时,该变量对每一行都具有相同的值。用户定义的变量存储为字符串,而不是特定的数据类型。再次说明!非常感谢。如果我们在一个地方拼错了变量名,因此它不匹配,那么它是对两个不同变量的引用。MySQL不会抛出错误,外部选择将使用与内联视图中指定的值不同的值。无错误,但结果不正确/意外。如果我们对列别名执行相同的操作,那么MySQL会抛出一个错误,我还认为用户定义变量会给读者添加不必要的混淆,读者可能会问“为什么这里需要用户定义变量?”用户定义变量是一个强大的功能,在某些情况下几乎是不可或缺的。我更倾向于将用户定义变量的使用保留在它们提供实际好处的情况下。