2007年7月21日土曜日

h-indexをSQLで

後で推敲


「h-index を Ruby で書いてみた」を見て、ついカッとなってやった。後悔はしていない。でもSQLで書くなんて当たり前すぎてつまらない。


分析関数


Oracle8.1.6EE以降またはSQL Server 2005なら分析関数が楽。



SELECT COUNT(*) FROM
(SELECT
ITEM,
ROW_NUMBER OVER (ORDER BY ITEM DESC) AS INDEX
FROM DATA
WHERE INDEX <= ITEM)

COUNT(*)ならROW_NUMBERの代わりにRANKでもおk。
ROW_NUMBER限定ならCOUNT(*)の代わりにMAX(INDEX)でもおk。



OracleのROWNUM


ROWNUMならサブクエリが増える(ORDER BYのため)



SELECT COUNT(*) FROM
(SELECT
ITEM,
ROWNUM AS INDEX
FROM (SELECT ITEM FROM DATA ORDER BY ITEM DESC)
WHERE INDEX <= ITEM)


JOINで順位付け


MySQLとかSQL Server 2000とかみたいに上の手段が×ならJOIN(ここでは書いていないけど、ユーザ変数でも可。効率がいいのはどっちなんだろう。誰か教えて)。



SELECT COUNT(*) FROM
(SELECT
T1.ITEM AS ITEM,
COUNT(*) AS INDEX
FROM DATA AS T1, DATA AS T2
WHERE T1.ITEM <= T2.ITEM
GROUP BY t1.ITEM
HAVING INDEX <= ITEM)

これだとROW_NUMBERというよりはRANK的な数値になるんで、
INDEXというエイリアシングは良くないけど、上の例にあわせた。



サブクエリが使えない



サブクエリも試してみたけど
昔のMySQL相手じゃ意味が無い!
だから次は絶対勝つために
僕は一時テーブルだけは最後までとっておく

0 件のコメント:

コメントを投稿