[pgsql-jp: 31469] Re: グループ化して最小一覧を取得
hirano_kozo
hirano_kozo @ tandem-sys.co.jp
2003年 11月 14日 (金) 17:07:25 JST
渡辺さん
limitを使ってはどうでしょうか?
データ数が多いレコードのMAX、MINの取得は関数を使うより
order by でソートした結果に対してlimitをつけて取得し
たほうが早く結果が得られます。
select kuda, santi, kakaku
from yahoya
where kakaku=(select kakaku from yahoya b where b.kuda=yahoya.kuda order by kakaku limit 1);
なんかどうでしょうか?
それでも遅ければ、Indexの検討などが必要だと思います
--- pgsql-jp @ ml.postgresql.jp ---
>渡辺(雄)@NTT-ITです
>
>以下のようなテーブルがあります。
>「果物の種類」「その産地」「価格」「その他」の列があります。
>果物の種類ごとに、一番安い価格とその産地を取り出すために以下のSQLを
>書いたのですが、実際のテーブルは6840行で
>結果を得るまでに20分ほどかかってしまっています。
>もっと早く結果を得るにはどのようにしたらよいでしょうか?
>
>バージョンは PostgreSQL 7.3 on i686-pc-linux-gnu, compiled by GCC 2.96 です
>
> kuda | santi | dummy1 | kakaku
>-------+-------+--------+--------
> ringo | tokyo | a | 100
> ringo | chiba | b | 100
> ringo | saita | c | 90
> ringo | kanag | a | 80
> ringo | gunma | b | 70
> ringo | ibara | c | 70
> mikan | tokyo | a | 200
> mikan | chiba | b | 200
> mikan | saita | c | 190
> mikan | kanag | a | 180
> mikan | gunma | b | 170
> mikan | ibara | c | 170
> nashi | tokyo | a | 110
> nashi | chiba | b | 110
> nashi | saita | c | 100
> nashi | kanag | a | 90
> nashi | gunma | b | 80
> nashi | ibara | c | 80
> meron | tokyo | a | 60
> meron | chiba | b | 60
> meron | saita | c | 55
> meron | kanag | a | 50
> meron | gunma | b | 45
> meron | ibara | c | 45
>
>上のテーブルでは
> ringo | tokyo | a | 100
> ringo | tokyo | a | 90
>の様に、果物と産地が重複することはありません。
>
>考えたSQL文
>
>select kuda, santi, kakaku
>from yahoya
>where kakaku=(select min(kakaku) from yahoya b where b.kuda=yahoya.kuda);
>
>得たい結果
>
> kuda | santi | kakaku
>-------+-------+--------
> ringo | gunma | 70
> ringo | ibara | 70
> mikan | gunma | 170
> mikan | ibara | 170
> nashi | gunma | 80
> nashi | ibara | 80
> meron | gunma | 45
> meron | ibara | 45
>
>よろしくお願いします
pgsql-jp メーリングリストの案内