[pgsql-jp: 26451] Re: 集約関数と副問い合わせ

ISHIDA Akio iakio @ pjam.jpweb.net
2002年 6月 19日 (水) 12:35:46 JST


こんにちは。石田@苫小牧市です。

On Sun, Jun 16, 2002 at 10:00:02PM +0900, 高森 みつき wrote:
> ファイルのアクセス履歴を取っています。
> フィールド構成は
> アクセスした人|アクセス日
> の2フィールドとしています。
> 
> これから日付ごとに、初めてアクセスした人がどれだけいるか
> 表示したいのです。(これは以前教えていただいたSQLです)
> 
> select month,count(*) from
>  (select name,min(to_char(time,'YYYY-MM-DD')) as t_date
>   from database group by name) as t 
> group by t_date
> order by t_date
> 人ごとに、一番初めにアクセスした日を取得し
> カウントしています。
> 
> 期待通りの結果は得られたのですが、表示まで時間がかかります。
> MINの部分で時間がかかっているのです。
> 
> 各日のアクセス者を調べ、以前に同じアクセス者がいれば後のレコードは調査し
> ない。
> ない場合にだけカウントしたいのです。
> こういうことって実現できるのでしょうか?
> 
> 泥沼にはまっています。
> 
> みつき@考え中・・


速いかどうかはわかりませんが、こう書きかえることもできそうです。

select to_char(d, 'YYYY-MM-DD'), count(*) from database as d1
 where not exists 
      (select * from database as d2
        where d1.name = d2.name
          and d1.time > d2.time)
  group by to_char(d, 'YYYY-MM-DD')

# explain の結果もよかったら教えてください。

-- 
ISHIDA Akio




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