このところ、オライリーの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


な感じ。


精度とか、どうなんよ?ほんとに大丈夫なんよ?
というところは未検証だけど、数学に弱い僕の頭だと、
その考え方が新鮮だった。



こういうのが続々と乗っているのでなかなか楽しい。