ページ

2014年4月9日水曜日

postgresで区切り文字を集計する

備忘録のないようです。

以下のように「,」区切りの文字が連結されている状態でグループ化を行うための操作を記述

CREATE TABLE nodes(tags TEXT);
INSERT INTO nodes VALUES('tag1,tag2,tag3');
INSERT INTO nodes VALUES('tag1,tag3');
INSERT INTO nodes VALUES('tag1,tag3');
INSERT INTO nodes VALUES('tag1,tag4,tag5');
このデータを以下のようにしたい
tag   | count 
-------+-------
 tag1  |     4
 tag3  |     3
 tag2  |     1
 tag4  |     1
 tag5  |     1

このような処理はどのようにと呼ぶのか分からないがニュアンス的には
・区切り文字配列化
・パース配列化
・文字列分割結合
などか?

正式名称が知りたい・・・・
とりあえずSQLだけ記載
SELECT tag, COUNT(tag) FROM (SELECT UNNEST(STRING_TO_ARRAY(tags, ',')) FROM nodes) AS T1 GROUP BY tag ORDER BY COUNT(tag) DESC, tag;
UNNESTとSTRING_TO_ARRAYを利用することで対応が可能である。

UNNESTで検索を行うといろいろ応用が出てくるので参考にしてみたい。
とりあえず自分の目的は上記で解決です。