浮点字段上的MySQL GROUP BY

时间:2012-06-20 03:33:48

标签: mysql group-by floating-accuracy

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用CAST()将小数转换为字符串,并仅使用转换后的字符串的前5个字符("x.xxx"),然后您可以将其与GROUP BY分组:< / p>

例如:

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

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

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

有关CAST()TRUNCATE()

的其他信息

答案 1 :(得分:2)

将float更改为十进制。见Problems with Floating-Point Values

答案 2 :(得分:0)

请勿使用FLOAT类型。请改用DECIMAL。 Float将十进制数转换为二进制数,从而导致舍入(精度损失)。十进制将数字存储为小数 - 无转换。

如果不允许更新表定义,而不是查询,请将float列强制转换为DECIMAL。