[pgsql-jp: 37630] SLECTの結果が閾値を超えた場合に別処理させたい

河本陽一 komoto.yoichi @ kcc.co.jp
2006年 11月 6日 (月) 15:20:09 JST


こうもとです。

 ホスト名とディレクトリ名の組み合わせのテーブルがあります。
 ホストごとにディレクトリ名の一覧を取得したいのですが、各ホストのディ
レクトリ数が閾値を超えた場合は別の処理(専用のディレクトリ名を1行だけ
返す)にしたいのです。

 テーブルの構造は、以下のようになっています。
#アクセスログの解析に使用しているので、日付情報も含まれています。

CREATE TABLE lfpath (
    pno     serial PRIMARY KEY,
    logdate date,
    host    text,
    path    text
);

 ホストごとに、パス名でソートした結果を取り出したいので、以下のよう
なSQLを発行しています。

=> SELECT host,path FROM lfpath WHERE logdate BETWEEN '2006-03-01'
AND '2006-03-31' GROUP BY host,path ORDER BY host,path;

 この問い合わせでは、hostに対するpathの数が何件あろうとも全件返しま
す(当たり前ですが)。
 以下のように、hostごとの件数を数えてからやろうとしましたが、毎日数
万件あるため、問い合わせコストが馬鹿になりません。

=> SELECT host,count(*) FROM lfpath WHERE (pno) in (SELECT distinct
on(host,path) pno FROM lfpath WHERE logdateBETWEEN '2006-03-01' AND
'2006-03-31') GROUP BY domain;

 最悪、hostごとに返すpathの最大行数を閾値まで、というのでもよいかと
思っています。

#まだ、DBのつくりを考えているところですので、テーブルの構成はどうに
でもなります。

======================================================================
河本陽一(こうもとよういち)
mailto:komoto.yoichi @ kcc.co.jp




pgsql-jp メーリングリストの案内