
以下の条件を取得したいのですがどのような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で質問しましょう!
似たような質問が見つかりました
- 数学 a1,a2, a3をベクトル空間Vのベクトルとする。a1+a2,a2+a3,a3+a1が一次独立のと 2 2022/10/02 15:55
- 数学 座標平面上に放物線 C1: y=ax^2+b^x+4 がある。 C1と直線 y=1に関して対称で あ 1 2023/07/16 22:27
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- Excel(エクセル) エクセル関数について 2 2022/05/30 14:36
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Excel(エクセル) スプレッドシートについて A1÷B1の値をC1に、A2÷B2をC2、A3÷B3をC3…といった感じで 1 2022/05/17 20:24
- Excel(エクセル) Excel での関数についての質問です。 例えばA列に商品名を、B列に個数をそれぞれ入力しています。 7 2023/05/13 10:51
- Excel(エクセル) エクセルについての質問です A1に入力した数字をB1に入力した数字に+して C1に出した時に、B2に 4 2022/12/09 21:57
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL
-
SELECT のWHEREに別のSELECT
-
SQLでの抽出条件
-
SQL文の作成でなやんでいます。
-
SQLのUPDATE文について
-
AccseeのSQL文について教えてく...
-
クエリでこのテーブルのデータ...
-
別のテーブルの値を抽出条件と...
-
SQL 件数取得を速くしたい
-
select into句のトランザクショ...
-
GROUP BYを使うのでしょうか?S...
-
アクセスで重複データが消えて...
-
入力された数字のうち、10台...
-
他のDBのテーブルと内部結合...
-
コンボボックスで入力したもの...
-
500Gのテキストファイルから全...
-
ACCESSのSQLで、NULLかNULLでな...
-
SQL関数とレスポンスについて
-
Accessでの自己結合?
-
大規模なデータウェアハウスを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ビューで引数を使いたい
-
ACCESS 一番最新の日付の金額...
-
IFで条件を分岐させてのINSERT...
-
Access関数について クエリで空...
-
Insert Into Select での重複に...
-
SQLで○○の値以外を持っているレ...
-
select into句のトランザクショ...
-
空のテーブルの判別
-
SQL 件数取得を速くしたい
-
別のテーブルの値を抽出条件と...
-
DB2 業種毎に連番をつけたいの...
-
大学でSQLの授業があるのですが...
-
リレーションシップ 全データを...
-
Sql文のUpdateと副問い合わせで...
-
複数のテーブルから同じ条件で...
-
Access2000 選択クエリで最新...
-
Accessで在庫管理を
-
SQLについて質問です。 テーブ...
-
SQLの書き方
-
2つのテーブルを結合して合計(...
おすすめ情報