-
1:ID:kt4AtM · 2019-08-05

#srk SQLでGROUP化する時、

AREA DATE
群馬 2019/1/1
群馬 2019/2/10
群馬 2018/3/4
鳥取 2017/10/29
鳥取 1999/4/8

GTOUP BY `AREA`
で グループ化 !

群馬 2018/3/4
鳥取 1999/4/8

とかになりますが、グループしたものの中でも
最新のものをとか、最大のものを
というふうに取ってくるにはどうすればいいでしょうか。

ググると、サブクエリを使って MAX関数等をいれるといけるみたいですが
レコード数 100件 200件では問題ないですが
10000件 20000件クラスになると 鬼重くなります。
(たぶんサブクエリが10000回 20000回実行されてる)

パフォーマンスも両立しながら上記の内容を実現するにはどうすれば良いでしょうか?
よろしくおねがいします。

7 件の回答

2:ID:fpBqsp · 2019-08-05

サブクエリを使わない。テーブルを見直す、JOINを使う。

3:ID:NtVN5P · 2019-08-06

AREAとDATEの列は同じテーブルにあるの?それなら、
select AREA, MAX(DATE)
FROM テーブル名
group by AREA
で取れるけど。

4:ID:Ye4lKy · 2019-08-06

サブクエリを使わず

select area, max(`date`) from テーブル名 group by area;

だけでイケる。

5:ID:Ye4lKy · 2019-08-06

Re:4
あ、かぶった・・・

6:ID:NtVN5P · 2019-08-06

あ、もしかして、GroupByした結果の中で、最大日付のを1レコードほしいのかな。
だとすると、
select top 1 AREA, max(DATE)
from テーブル名
group by AREA
order by max(DATE) desc
で取れるよ。

7:ID:NtVN5P · 削除
8:ID:NtVN5P · 2019-08-06

Re:6
↑はSQLServerだけど、Oracleなら
select * from(
select AREA, max(DATE)
from テーブル名
group by AREA
order by max(DATE) desc)
where ロウnum = 1
で取れると思うよ。
(whereの最後の一文字と、ロウで禁止ワードに引っかかったw)

コメントの受付は終了しました。

一緒に読まれている質問

ページ上部に戻る