【问题标题】:MySQL GROUP BY on a float field浮点字段上的 MySQL GROUP BY
【发布时间】:2012-06-20 03:33:47
【问题描述】:

我有一个包含以下列的表格:

ID int, DISTANCE float, EVENT Varchar

我想要实现的是选择所有数据,但按事件和距离字段分组(即删除相同距离的重复事件)。

我可以看到的问题是Distance 列是一个浮点数,因此GROUP BY 的行为可能不会符合预期。大多数(我说大部分)数据存储到小数点后 3 位,这是我想要分组的标准。

示例数据:

ID、距离、事件

1, 0.001, A
2, 0.002, A
3, 0.002, A
4, 0.002, B
5, 0.003, C
6, 0.0035,C

所以结果应该是这样的:

1, 0.001, A
2, 0.002, A
4, 0.002, B
5, 0.003, C

【问题讨论】:

    标签: mysql group-by floating-accuracy


    【解决方案1】:

    您可以使用CAST() 将小数转换为字符串,并且只使用转换后字符串的前5 个字符("x.xxx"),然后您可以使用GROUP BY 对其进行分组:

    例如:

    SELECT
        ID,
        CAST(Distance AS CHAR(5)) AS DistanceGroup,
        Event
    FROM 
        yourtbl
    GROUP BY
        DistanceGroup,
        Event
    

    编辑:您还可以在Distance 字段上使用TRUNCATE(),这实际上可能在性能方面更好:

    SELECT
        ID,
        TRUNCATE(Distance, 3) AS DistanceGroup,
        Event
    FROM 
        yourtbl
    GROUP BY
        DistanceGroup,
        Event
    

    关于CAST()TRUNCATE() 的更多信息

    【讨论】:

      【解决方案2】:

      将浮点数更改为十进制。见Problems with Floating-Point Values

      【讨论】:

      • 我知道这将是理想的解决方案,但我不能这样做。必须有办法 GROUP BY 距离到小数点后 3 位。
      • 你为什么不能这样做?只需将距离列更改为小数(18,5)左右
      • 我无法控制许多数据库。我会仔细看看的。与此同时,希望有人有另一种解决方案。
      【解决方案3】:

      不要使用FLOAT 类型。请改用DECIMAL。浮点数将十进制数转换为二进制数,这会导致舍入(精度损失)。 Decimal 将数字存储为小数 - 无需转换。

      如果不允许更新表定义,则在查询中将浮点列强制转换为 DECIMAL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-02
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        • 2017-12-23
        相关资源
        最近更新 更多