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()して 10 進数を文字列に変換し、変換された文字列 ( "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

float を decimal に変更します。浮動小数点値の問題を参照してください

于 2012-06-20T03:40:46.930 に答える
0

FLOATタイプは使用しないでください。DECIMAL代わりに使用してください。Float は 10 進数を 2 進数に変換するため、丸めが行われます (精度が失われます)。Decimal は数値を 10 進数として格納します - 変換はしません。

テーブル定義を更新することが許可されていない場合は、クエリで float 列を DECIMAL にキャストします。

于 2017-01-05T18:46:24.793 に答える