Salesforceの数式で個人的によく使うもののメモです。
算術のあれこれ
桁数の計算
数値$N$の桁数$n$は下記の数式で定義できます。
n-1\le\log_{10}N<n
Salesforceでは、LOG関数とFLOOR関数を使うことで計算ができます。
FLOOR( LOG( 数値型 ) + 1 )
これは、大きな値を扱う場合に桁数を省略する場面で活躍します。例えば、金額を省略形で示す場合は下記のように表現できます。
TEXT( FLOOR( 数値型 / 10 ^ FLOOR( ( FLOOR( LOG( 数値型 ) ) ) / 4 ) ) )
+ CASE( FLOOR( ( FLOOR( LOG( 数値型 ) ) ) / 4 ) ,
0 , "円" ,
1 , "万円" ,
2 , "億円" ,
3 , "兆円" ,
...
)
対数関数の底の変換
Salesforceで準備されている対数関数は自然対数と常用対数のみのため、その他の底で対数計算を行う場合には変換を行う必要があります。このとき、底の変換公式
\log_{x}b=\frac{\log_{a}b}{\log_{a}x}
を利用します。変換先の底が$x$とすると、$a$はSalesforceで準備されている対数関数を加味して自然対数または常用対数の底を選択すると良いです。よって、数値型の値に対して任意の底の対数関数を計算する場合は下記のように表現されます。
LOG( 数値型 ) / LOG( 任意の底 )
直線からの距離の計算
$xy$の平面上に
ax+by+c=0
の直線の方程式が定義されている場合に、データ点$(x_{0},y_{0})$と直線の間の距離は
\frac{|ax_{0}+by_{0}+c|}{\sqrt{a^{2}+b^{2}}}
で表現されます。これをSalesforceの数式を使って表現すると下記のようになります。
ABS( a * x0 + b + y0 + c ) / SQRT( a ^ 2 + b ^ 2 )
これは、散布図の点に対する評価の一種として使える場合があります。
緯度経度からの距離の計算
緯度経度から距離を計算するには、地球が楕円体であることを加味して計算を行う必要があります。
厳密な計算を行うためには複雑な計算式が必要ですが、大凡の数値であれば下記のような簡潔な数式で計算することができます。
d = \sqrt{\left[\left(D_{y1}-D_{y2}\right)\cdot R_{x} \cdot \left(1-\left|\frac{R_{x}^{2}-R_{y}^{2}}{R_{x}^{2}}\right|\right) \cdot \left(1-\left|\frac{R_{x}^{2}-R_{y}^{2}}{R_{x}^{2}}\right| \cdot \sin^{2}\left(\frac{D_{y1}-D_{y2}}{2}\right)\right)^{-\frac{3}{2}}\right]^{2}+\left[\left(D_{x1}-D_{x2}\right)\cdot R_{x} \cdot \left(1-\left|\frac{R_{x}^{2}-R_{y}^{2}}{R_{x}^{2}}\right| \cdot \sin^{2}\left(\frac{D_{y1}-D_{y2}}{2}\right)\right)^{-\frac{1}{2}} \cdot \cos\left(\frac{D_{y1}-D_{y2}}{2}\right)\right]^{2}}
これは、2つの緯度経度$(D_{1},D_{2})$の間の距離の式で、それぞれ下記のようなラジアン単位の緯度経度の値を持ちます。
\begin{eqnarray}
D_{1} &=& (D_{x1} , D_{y1})\\
D_{2} &=& (D_{x2} , D_{y2})
\end{eqnarray}
$R_{x}$と$R_{y}$は楕円体の長半径と短半径で、WGS84の測地系では下記の値となります。
\begin{eqnarray}
R_{x} &=& 6,378,137.000000\\
R_{y} &=& 6,356,752.314245
\end{eqnarray}
これを踏まえて、Salesforceの数式で表現すると、下記のようになります。
SQRT(
(
( 緯度1 - 緯度2 )
* 6,378,137.000000
* ( 1 - ABS( ( 6,378,137.000000 * 6,378,137.000000 - 6,356,752.314245 * 6,356,752.314245 ) / ( 6,378,137.000000 * 6,378,137.000000 ) ) )
/ SQRT(
( 1 - ABS( ( 6,378,137.000000 * 6,378,137.000000 - 6,356,752.314245 * 6,356,752.314245 ) / ( 6,378,137.000000 * 6,378,137.000000 ) ) * SIN( ( 緯度1 - 緯度2 ) / 2 ) ) ^ 3
)
) ^ 2
+ (
( 経度1 - 経度2 )
* 6,378,137.000000
/ SQRT(
( 1 - ABS( ( 6,378,137.000000 * 6,378,137.000000 - 6,356,752.314245 * 6,356,752.314245 ) / ( 6,378,137.000000 * 6,378,137.000000 ) ) * SIN( ( 緯度1 - 緯度2 ) / 2 ) )
)
) ^ 2
)
この数式は緯度経度の間の距離をメートル単位で計算します。
上記の緯度経度の情報が度数法であればラジアンに変換する必要があり、簡単とはいえ長大な数式ではあります。度数法の緯度経度を持っている場合、Salesforceの地理位置情報特有の関数を使って、もっと短く下記のように書くこともできます。
DISTANCE( GEOLOCATION( 緯度1 , 経度1 ) , GEOLOCATION( 緯度2 , 経度2 ) , "km" )
この数式は緯度経度の間の距離をキロメートル単位で計算します。