[pgsql-jp: 31480] Re: グループ化して最小一覧を取得

Hiroshi Ninomiya nino @ hat.hi-ho.ne.jp
2003年 11月 15日 (土) 10:55:23 JST


二宮といいます。
初めて投稿します。データベースを始めてまもなく初心者なのですが
同じような集約関数を使って、統計処理をしてます。

自分の勉強のためにも、ちょっと投稿してみました。
まちがってたらすみません。

以下でどうですか

SELECT t1.kuda, yahoya.santi, t1.min 
 FROM yahoya ,
           (select kuda ,min(kakaku) from yahoya GROUP BY kuda) AS t1
WHERE (t1.kuda, t1.min) = (yahoya.kuda, yahoya.kakaku);

こちらの環境で同じテーブルをいれて実行してみました。

explain analyze での 結果は
 cost=0.00..22535.00 で Total runtime 1.27 msec が
 cost=77.58..135.08 で Total runtime: 0.70 msec
となりました。 

結果
  kuda   |  santi  | min
---------+---------+-----
  ringo  |  gunma  |  70
  ringo  |  ibara  |  70
  mikan  |  gunma  | 170
  mikan  |  ibara  | 170
  nashi  |  gunma  |  80
  nashi  |  ibara  |  80
  meron  |  gunma  |  45
  meron  |  ibara  |  45


以下 explain analyze の結果です。 

test=> explain analyze select t1.kuda, yahoya.santi,t1.min from yahoya ,
(select kuda ,min(kakaku) fr om yahoya group by 1) as t1 where (t1.kuda,
t1.min) = (yahoya.kuda,yahoya.kakaku);
                                                               QUERY
PLAN

------------------------------------------------------------------------
----------------------------
------------------------------------
 Hash Join  (cost=77.58..135.08 rows=2 width=104) (actual
time=0.37..0.46 rows=8 loops=1)
   Hash Cond: ("outer".kakaku = "inner".min)
   Join Filter: ("inner".kuda = "outer".kuda)
   ->  Seq Scan on yahoya  (cost=0.00..20.00 rows=1000 width=68) (actual
time=0.01..0.06 rows=23 loo
ps=1)
   ->  Hash  (cost=77.33..77.33 rows=100 width=36) (actual time=0.30..0.
30 rows=0 loops=1)
         ->  Subquery Scan t1  (cost=69.83..77.33 rows=100 width=36)
(actual time=0.21..0.29 rows=4
loops=1)
               ->  Aggregate  (cost=69.83..77.33 rows=100 width=36)
(actual time=0.20..0.28 rows=4 l
oops=1)
                     ->  Group  (cost=69.83..74.83 rows=1000 width=36)
(actual time=0.17..0.24 rows= 23 loops=1)
                           ->  Sort  (cost=69.83..72.33 rows=1000
width=36) (actual time=0.16..0.18 rows=23 loops=1)
                                 Sort Key: kuda
                                 ->  Seq Scan on yahoya  (cost=0.00..20.
00 rows=1000 width=36) (actu al time=0.02..0.06 rows=23 loops=1)  Total
runtime: 0.70 msec (12 rows)


 
 渡辺さんのSQL での結果

test=> explain analyze select kuda, santi, kakaku
test-> from yahoya
test-> where kakaku=(select min(kakaku) from yahoya b where 
test-> b.kuda=yahoya.kuda);
                                                   QUERY PLAN

------------------------------------------------------------------------
----------------------------
------------
 Seq Scan on yahoya  (cost=0.00..22535.00 rows=5 width=68) (actual
time=0.25..1.16 rows=8 loops=1)
   Filter: (kakaku = (subplan))
   SubPlan
     ->  Aggregate  (cost=22.51..22.51 rows=1 width=4) (actual
time=0.04..0.04 rows=1 loops=23)
           ->  Seq Scan on yahoya b  (cost=0.00..22.50 rows=5 width=4)
(actual time=0.01..0.03 rows= 6 loops=23)
                 Filter: (kuda = $0)
 Total runtime: 1.27 msec
(7 rows)

ちなみに実行した環境は
 postgresql-7.4.2
  RH9
  celon 1.8G
  memory 512M





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