このところ、オライリーのSQL Hacksを読んでいる。
DBMSを使ってるシステムだと、
SQLで実装している部分がパフォーマンスのボトルネックになったり、
どこどこのデータをこうこう並べた帳票を出力してほしい、
というような依頼がよくきたりする。
言語としてのSQLはあまり好きではなかったけれど、
必要に迫られてやってるうちに
いじるのが少し楽しくなってきた。
まぁ、それはおいとくとして、読んでいて
おお!と思ったところを少し紹介してみる。
例えば、「行をまたがった乗算」なんかが(自分にとっては)新鮮だった。
SQLにはSUM()はあるけれどPRODUCT()がない。
言われてみればそうだなぁ、という感じなんだけど、
複利の計算なんかやるときには不便な気がする。
でも対数を使えばSQL一本でできる。
LN()関数というのがあって、これは指定した数値の自然対数を返す。
対してEXP()関数というのがあって、これは指定した数値でネイピア数を乗算した結果を返す。
つまり、LN()を使って指数にしてしまえば、SUM()でPRODUCT()を
エミュレート(かどうかは微妙だけど)できる。
SELECT EXP(SUM(LN( product_target ) ) ) AS ANS_PRODUCT
FROM TARGET_TABLE
な感じ。
精度とか、どうなんよ?ほんとに大丈夫なんよ?
というところは未検証だけど、数学に弱い僕の頭だと、
その考え方が新鮮だった。
こういうのが続々と乗っているのでなかなか楽しい。