[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 メーリングリストの案内