MULとは、値の漸進的な乗算を意味しますか?
小さなサイズ(たとえば10秒)の行が100行ある場合でも、MUL(列)はすべてのデータ型をオーバーフローします。誤用/乱用の可能性が非常に高く、使用範囲が非常に限られているため、SQL標準である必要はありません。他の人が示しているように、SQLで標準的な(そして一般的な)方法を使用してトリッキーな計算を行う多くの方法があるのと同じように、それを解決する数学的な方法があります。
サンプルデータ:
Column
1
2
4
8
COUNT : 4 items (1 for each non-null)
SUM : 1 + 2 + 4 + 8 = 15
AVG : 3.75 (SUM/COUNT)
MUL : 1 x 2 x 4 x 8 ? ( =64 )
完全を期すために、Oracle、MSSQL、MySQLのコア実装*
Oracle : EXP(SUM(LN(column))) or POWER(N,SUM(LOG(column, N)))
MSSQL : EXP(SUM(LOG(column))) or POWER(N,SUM(LOG(column)/LOG(N)))
MySQL : EXP(SUM(LOG(column))) or POW(N,SUM(LOG(N,column)))
- SQLServerでEXP/LOGを使用する場合は、リターンタイプhttp://msdn.microsoft.com/en-us/library/ms187592.aspx に注意してください。
- POWERフォームでは、(オイラーの数よりも大きい底を使用して)より大きな数を使用できます。結果が大きくなりすぎて、POWERを使用して元に戻せない場合は、対数値のみを返し、実際の数を計算することができます。 SQLクエリ
* LOG(0)およびLOG(-ve)は未定義です。以下は、SQLServerでこれを処理する方法のみを示しています。同じ概念を使用して、他のSQLフレーバーと同等のものを見つけることができます
create table MUL(data int)
insert MUL select 1 yourColumn union all
select 2 union all
select 4 union all
select 8 union all
select -2 union all
select 0
select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE
EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics
* round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives
END
from MUL
材料:
- データのabs()を取得し、minが0の場合、他の無駄なものを掛けると、結果は0になります
- データが0の場合、NULLIFはそれをnullに変換します。 abs()とlog()はどちらもnullを返すため、sum()から除外されます
- データが0でない場合、absを使用すると、LOGメソッドを使用して負の数を乗算できます。他の場所で負の数を追跡します
- 最終的な兆候を見つける
- sign(data)は
1 for> 0
を返します 、0 for 0
<0の場合は-1 。
- さらに0.5を追加し、sign()を再度取得するため、0と1の両方を1に分類し、-1のみを-1に分類しました。
- ネガティブをカウントするだけでよいので、ここでもNULLIFを使用してCOUNT()から1を削除します。
-
%2
負の数のcount()に対して、どちらかを返します - ->奇数の負の数がある場合は1
- ->負の数が偶数の場合は0
- より数学的なトリック:0.5から1または0を取り、上記が次のようになるようにします
- ->(
0.5-1 =-0.5
=> -1に丸めます )負の数が奇数の場合 - ->(
0.5-0 =0.5
=>1に丸める )負の数が偶数の場合 - 実際の結果のSUM-PRODUCT値に対して、この最終的な1/-1を乗算します
- sign(data)は