2

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

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
4

3 回答 3

3

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

前任:

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()的附加信息

于 2012-06-20T04:27:59.423 回答
2

将浮点数更改为十进制。请参阅浮点值问题

于 2012-06-20T03:40:46.930 回答
0

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

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

于 2017-01-05T18:46:24.793 回答