後で推敲
「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 件のコメント:
コメントを投稿