象と戯れ

 | 

2008-12-25

出現文字を数え上げる

20:45 | 出現文字を数え上げる - 象と戯れ を含むブックマーク はてなブックマーク - 出現文字を数え上げる - 象と戯れ

問い:

テーブル

CREATE TABLE item AS(
  item_cd varchar(6),
  item_name varchar(50)
);

から、item_cdに含まれる文字(NOT文字列)の出現頻度を数え上げなさい。

答え:

SELECT
  s, COUNT(*)
FROM(
  SELECT substring(item_cd, p, 1) AS s
  FROM(
    SELECT item_cd, generate_series(1, length(item_cd) - 1) AS p
    FROM item
  )s
)s
GROUP BY 1
ORDER BY 1
;

同じテクニックを使うとSuffix Arrayとかもすぐ作れますね。ということに書きながら気づく。

L.starL.star2008/12/25 21:06一方で、PostgreSQLはセッション間でprepared statement cacheを持たないわけで、よほど繰り返さない限り利用する意味はなかったりもする。

そういえば、7.3とかprepareが入りたての頃は色々ひどかったなぁ。

umitanukiumitanuki2008/12/25 21:19なるほど。正直自分もあまりPreparedは使ってないのですが。。。パフォーマンスというよりどちらかというと利便性から使っていますね。SQL組み立てるのが面倒なときとか。

iakioiakio2008/12/25 22:58そこは regexp_split_to_table(item_cd, '') とかじゃないですかね<問題の方

umitanukiumitanuki2008/12/25 23:02regexp_split_to_tableって、うわー知らなかった。ていうかiakioさんのところで既に紹介済みですね。

とわいえ、文字列や配列を行に直してGROUP BYするとかっていろいろ解析目的で使えそうなので試行錯誤中です

 |