doubleタイプフィールドとsqlのorder byとgroup byの恩讐
1191 ワード
BI線のデータテストを担当したことがありますが、面白い問題がありました。毎回問題を分析して、最後まで調べるのはとても基本的な問題です。例えば、浮動小数点の種類は足し算の交換法則を満たしていません。はテーブル構造があります。 名を列する
タイプ
id
BIGINT
price
Double
order.id
VRCHAR
buyer_id
VRCHAR case 1データ抽出のsql:select sum(a)from test where id>1000 order by order_id;select sum(a)from test where id>1000以上の二つのsqlの結果は、データ量が増加するにつれて、許容可能な誤差範囲よりも大きくなります。 case 2今は姿勢を変えてもう一回来ます。select sum from(select sum(a)as columnual from test group by buyer table 1 結果はcase 1と同じで、違いはデータ量の増加とともに、許容可能な誤差範囲よりもはるかに大きい。
この二つのケースの中で、二つの注意事項があります。 order byまたはgroup byは、元のデータの順序を変更する。 浮動小数点数が交換則 を満たしていません。
アプリケーション内のあるフィールドがお金に関する敏感なフィールドである場合、誤差範囲を制御するために1000を掛けたほうがいいです。
最後に一つの面接実習生を共有する時、浮動小数点の問題について:C言語でプログラムを書いてください。二つの浮動小数点が等しいかどうかを判断します。
double a = value1;
double b = value2;
(a + b) != (b + a)
データ分析を行うSQLコードを共有します。タイプ
id
BIGINT
price
Double
order.id
VRCHAR
buyer_id
VRCHAR
select sum(a) from test where id>1000
この二つのケースの中で、二つの注意事項があります。
アプリケーション内のあるフィールドがお金に関する敏感なフィールドである場合、誤差範囲を制御するために1000を掛けたほうがいいです。
最後に一つの面接実習生を共有する時、浮動小数点の問題について:C言語でプログラムを書いてください。二つの浮動小数点が等しいかどうかを判断します。
// , true, false。
bool isEqual(double a, double b) {
if(abs(a-b) < 0.0000001) {
return true;
} else {
return false;
}
}
このプログラムはバグを隠しています。(a-b)オーバーフローの可能性があります。