以下の条件を取得したいのですがどのようなSQLを組めばいいか悩んでます。
テーブルA(列はC1,C2,C3,C4 PKはC1,C2です。)
■テーブルAのデータ
C1 C2 C3 C4
1 1 50 備考1です。
1 2 75 備考2です。
2 1 25 備考3です。
3 1 75 備考4です。
3 2 90 備考5です。
3 3 50 備考6です。
■取得したい結果
C1 C2 C3 C4
1 2 75 備考2です。
2 1 25 備考3です。
3 2 90 備考5です。
■取得したい条件
C1でグルーピングしたなかでC3の値が一番大きな行を取得する。
現在は以下のようなSQLを書いています。
SELCT T1.*
FROM テーブルA T1,
(SELECT C1,MAX(C3) AS C3MAX FROM テーブルA GROUP BY C1) T2
WHERE T1.C1 = T2.C1
AND T1.C3 = T2.C3MAX
もう少し簡単なSQLで出来そうですが、うまく思いつきません。
宜しくお願いします。
No.4ベストアンサー
- 回答日時:
掲示板を勘違いしてOracleで作成していました。
create table a
(
c1 int,
c2 int,
c3 int,
c4 nvarchar(50)
);
select x.C1,x.C2,x.C3,x.C4
from (
select C1,C2,C3,C4,max(C3) over(partition by C1) max_c3
from a) AS x
where x.C3 = x.max_c3;
SQL Serverだとこっち。
ご回答ありがとうございます。
対象のテーブルが120万件以上あるのでパフォーマンスを考慮したSQLだととても助かります。
試してみたいと思います。
No.3
- 回答日時:
あえていうなら分析関数を使う。
テーブルAのFullスキャン2回を1回に減らせるからデータ量が多いと効果があるかもしれません。
create table a
(
c1 number(2),
c2 number(2),
c3 number(2),
c4 varchar2(50)
);
insert into a values(1,1,50,'備考1です。');
insert into a values(1,2,75,'備考2です。');
insert into a values(2,1,25,'備考3です。');
insert into a values(3,1,75,'備考4です。');
insert into a values(3,2,90,'備考5です。');
insert into a values(3,3,50,'備考6です。');
select C1,C2,C3,C4
from (
select C1,C2,C3,C4,max(C3) over(partition by C1) max_c3
from a)
where C3 = max_c3
C1 C2 C3 C4
---------- ---------- ---------- -----------
1 2 75 備考2です。
2 1 25 備考3です。
3 2 90 備考5です。
実行計画
----------------------------------------------------------
Plan hash value: 2104940997
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 474 | 4 (25)| 00:00:01 |
|* 1 | VIEW | | 6 | 474 | 4 (25)| 00:00:01 |
| 2 | WINDOW SORT | | 6 | 396 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A | 6 | 396 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("C3"="MAX_C3")
Note
-----
- dynamic sampling used for this statement
統計
----------------------------------------------------------
0 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
707 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
3 rows processed
select T1.*
FROM A T1,(SELECT C1,MAX(C3) AS C3MAX FROM A GROUP BY C1) T2
WHERE T1.C1 = T2.C1
AND T1.C3 = T2.C3MAX;
実行計画
----------------------------------------------------------
Plan hash value: 494933846
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 92 | 8 (25)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 92 | 8 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL | A | 6 | 396 | 3 (0)| 00:00:01 |
| 3 | VIEW | | 6 | 156 | 4 (25)| 00:00:01 |
| 4 | HASH GROUP BY | | 6 | 156 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL| A | 6 | 156 | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."C1"="T2"."C1" AND "T1"."C3"="T2"."C3MAX")
Note
-----
- dynamic sampling used for this statement
統計
----------------------------------------------------------
44 recursive calls
0 db block gets
64 consistent gets
0 physical reads
0 redo size
707 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
4 sorts (memory)
0 sorts (disk)
3 rows processed
No.2
- 回答日時:
現状のSQLでは一番単純な方法と思います
WHERE句で最大値の行をなんて指定できるようになると違うのでしょうが…
でも、この書き方はOracle風ですね
SQL Serverなら
SELCT T1.*
FROM テーブルA AS T1
INNER JOIN(SELECT C1,MAX(C3) AS C3MAX FROM テーブルA GROUP BY C1) AS T2
ON T1.C1 = T2.C1
AND T1.C3 = T2.C3MAX
かな?
今はOracleでもJOIN記述も出来ますが(笑)
>WHERE句で最大値の行をなんて指定できるようになると違うのでしょうが…
そのようなことができないかなと思い投稿した次第です。
現状できないようですね・・・。
今のSQLで構築しようと思います。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
あなたの「プチ贅沢」はなんですか?
お仕事や勉強などを頑張った自分へのご褒美としてやっている「プチ贅沢」があったら教えてください。
-
人生でいちばんスベッた瞬間
誰しも、笑いをとろうとして失敗した経験があると思います。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
条件をつけて日付の古い行を抜き出したい
SQL Server
-
重複するキーから一番古い年月日のデータのみ取得したい
PostgreSQL
-
テーブルで一番古いレコードだけをSELECTしたい
MySQL
-
-
4
sqlで日付が一番古いデータの月を取得する方法
PHP
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS 一番最新の日付の金額...
-
IFで条件を分岐させてのINSERT...
-
ビューで引数を使いたい
-
select into句のトランザクショ...
-
DB2 業種毎に連番をつけたいの...
-
ACCESSのSQLで、NULLかNULLでな...
-
3つ以上のテーブルをUNIONする...
-
「マスタ」と「テーブル」の違...
-
SELECT時の行ロックの必要性に...
-
ストアドをまたがるローカル一...
-
Accessでクエリを完了できませ...
-
Access VBA [リモートサーバー...
-
SQLServer Insertが遅い
-
データの二重表示の原因
-
列名XXXXが無効です
-
あるテーブルのデータを追加、...
-
ACCESSにてテーブルをEXCEL形式...
-
SELECT文でのデッドロックに対...
-
重複するキーから一番古い年月...
-
インデックスの再構築の意味っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ビューで引数を使いたい
-
ACCESS 一番最新の日付の金額...
-
IFで条件を分岐させてのINSERT...
-
複数のテーブルから同じ条件で...
-
SQLで○○の値以外を持っているレ...
-
INSERT文でサブクエリ
-
SQL 件数取得を速くしたい
-
Insert Into Select での重複に...
-
SQLの書き方
-
2つのテーブルを結合して合計(...
-
二つの表の項目を比較して値を...
-
Access関数について クエリで空...
-
DB2 業種毎に連番をつけたいの...
-
select into句のトランザクショ...
-
空のテーブルの判別
-
大学でSQLの授業があるのですが...
-
別のテーブルの値を抽出条件と...
-
Access2000 選択クエリで最新...
-
Accessで在庫管理を
-
年齢分布テーブルの再集計SQL
おすすめ情報