提问人:Simon 提问时间:6/20/2012 更新时间:1/6/2017 访问量:3496
浮点字段上的 MySQL GROUP BY
MySQL GROUP BY on a float field
问:
我有一个包含以下列的表:
ID int, DISTANCE float, EVENT Varchar
我想实现的是选择所有数据,但按事件和距离字段分组(即删除相同距离的重复事件)。
我可以看到的问题是该列是一个浮点数,因此可能表现不佳。大多数(我说大多数)数据存储在小数点后 3 位,这是我想分组的标准。Distance
GROUP BY
示例数据:
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
答:
2赞
Roman Newaza
6/20/2012
#1
将浮点数更改为十进制。请参阅浮点值问题
评论
0赞
Simon
6/20/2012
我知道这将是理想的解决方案,但不,我不能这样做。必须有一种方法可以将 GROUP BY 距离精确到小数点后 3 位。
0赞
Roman Newaza
6/20/2012
为什么你不能这样做?只需将距离列更改为十进制(18,5)左右
0赞
Simon
6/20/2012
有许多数据库是我无法控制的。我会调查的。与此同时,希望有人有另一种解决方案。
4赞
Zane Bien
6/20/2012
#2
您可以使用将小数转换为字符串,并且仅使用转换后的字符串 () 的前 5 个字符,然后可以将其分组为:CAST()
"x.xxx"
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() 的其他信息
0赞
Ivan Georgiev
1/6/2017
#3
不要使用类型。请改用。Float 将十进制数转换为二进制,从而导致舍入(精度损失)。十进制将数字存储为小数 - 不进行转换。FLOAT
DECIMAL
如果不允许更新表定义,则在查询中将浮点列强制转换为 DECIMAL。
评论