2012-06-20 49 views
1

我有一個包含以下各列的表格:MySQL的GROUP BY在浮法領域

ID int, DISTANCE float, EVENT Varchar 

我想什麼acheive是選擇所有的數據,而是由事件和距離場組(即刪除相同距離的重複事件)。

我能看到的問題是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

您可以使用CAST()十進制轉換爲字符串,並只使用轉換字符串("x.xxx")的前5個字符,你可以再組與GROUP BY

例:

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

編輯

0123:您也可以在 Distance字段,實際上可能是在性能方面更好地利用
SELECT 
    ID, 
    TRUNCATE(Distance, 3) AS DistanceGroup, 
    Event 
FROM 
    yourtbl 
GROUP BY 
    DistanceGroup, 
    Event 

CAST()附加信息和TRUNCATE()

+0

+1謝謝Zane(再:) :)) – Simon

2

變化浮動十進制。見Problems with Floating-Point Values

+0

我知道這將是理想的解決方案,但我不能這樣做。必須有一種將GROUP BY距離設置爲3位小數的方法。 – Simon

+0

爲什麼你不能這樣做?只是將距離列更改爲十進制(18,5)左右 –

+0

有許多數據庫不受我的控制。我會仔細看看的。同時,希望有人有另一種解決方案。 – Simon

0

不要使用FLOAT類型。改爲使用DECIMAL。浮點數將十進制數轉換爲二進制數,導致四捨五入(精度損失)。十進制將數字存儲爲小數 - 不轉換。

如果您不允許更新表格定義,那麼在查詢中將float列轉換爲DECIMAL。