![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
Group By を使用して任意のカラムの最大値のデータを取得する。
次のようなテーブルデータがあるとします。
ID 店舗CD 適用日付
A001 101 20100701
A002 101 20100801
A003 101 20100901
B001 102 20100701
B002 102 20100801
B003 102 20100901
抽出イメージですが、このテーブルデータの店舗コードをGroupByして、MAX(適用日付)
としたときにIDが取得できなくなります。
なのでGroupByしたときの日付最大値のデータのIDを取得したいのですがいい方法が浮かびません。
同じテーブルデータでGroupBy(店舗コード)、MAX(適用日付)としたサブクエリを(店舗CD=店舗CD)、(適用日付=適用日付)とInnerJoinする方法も考えましたが、万が一、適用日付と店舗CDが同一のものがあった場合、店舗CDが重複してしまいます。
各店舗CDの最大適用日付のID取得したいのです。
なのでイメージはGroupby(店舗CD)とMAX(適用日付)とした時にMAX(適用日付)のIDを取得し、
なおかつ欲をいえば、MAX(適用日付)のIDが複数存在する場合は、1店舗CDにつき一つの適用日付を取得したいです。(この際、IDはなんでもいいです。)
簡単そうなことですごく悩んでいます。
どなたか助けてください。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
select ID,店舗CD,適用日付
from
(select x.*,row_number() over(partition by 店舗CD order by 適用日付 desc) R from TBL x)
where R=1
;
とか。
この回答への補足
ご回答ありがとうございます。
この方法で解決できそうです。
ちなみにPartition By のキーに複数項目を指定することはできるんでしょうか?
例えば、品番、サブ1、サブ2、サブ3ごとのデータで区切ってその中で昇順したい場面が出てきそうなので・・・
よろしくお願いします。
No.8
- 回答日時:
回答No.7 です。
WHERE句が間違っていました。ごめんなさい。
-------------------------------------------------------------------------
SELECT * FROM 対象テーブル a
WHERE
NOT EXISTS (SELECT 'x' FROM 対象テーブル b
WHERE a.店舗CD = b.店舗CD
AND (a.適用日付 < b.適用日付
OR (a.適用日付 = b.適用日付 AND a.ID < b.ID)));
-------------------------------------------------------------------------
以前も同じような質問に回答していただき
、また今回も回答ありがとうございます。
無事問題は解決できました。
ありがとうございます。
No.7
- 回答日時:
GROUP BY は使用しませんが、相関サブクエリを用いて下記の様に書くことが出来るかと。
同じ店舗で同じ適用日付に複数のIDが有る場合は若いIDが取得されます。
手元にORACLEが無いので未確認ですが。
-------------------------------------------------------------------------
SELECT * FROM 対象テーブル a
WHERE
NOT EXISTS (SELECT 'x' FROM 対象テーブル b
WHERE a.店舗CD = b.店舗CD AND a.適用日付 < b.適用日付 AND a.ID < b.ID);
-------------------------------------------------------------------------
「各店舗CDについて適用日付が最大のデータ」は以下の様に読み替えられます。
「『同じ店舗CDでより大きい適用日付の別のデータ』が無いデータ」
これをSQLで表現しています。
参考URL:http://codezine.jp/article/detail/1076?p=2
No.6
- 回答日時:
IDおよび適用日付を文字として結合してみてはどうでしょうか?
(データベースによって関数が異なるので出来るだけDBMSの種類をお教え頂ければと思います。)
MySQLの場合はCONCATで文字列結合なので以下のような感じです。
select 店舗CD, substring(A, 9,4) as ID from(
select 店舗CD, max(concat(適用日付,ID)) as A from テーブル
group by 店舗CD
) as T
結果としては
101, 20100901A003
102, 20100901B003
が返りますので、結合した文字の9文字目から4文字を取得すればIDが取れます。
※ORACLEの場合ROW_NUMBER()関数を利用すると一気に取ってくるのが可能です。
No.3
- 回答日時:
こんばんは。
例えば・・・、
SELECT DISTINCT MAX(ID) AS ID, 店舗CD, 適用日付
FROM
(SELECT ID, 店舗CD, 適用日付, MAX(適用日付) OVER(PARTITION BY 店舗CD) AS MAX_適用日付
FROM テーブル)
WHERE 適用日付 = MAX_適用日付
GROUP BY 店舗CD, 適用日付
とか・・・?。
今Oracleが手元にないので、ちょっと確認できませんが・・・。
ご回答ありがとうございました。
教えていただいたSQLを書いて実行してみたのですが、
エラーがでてしまいました。
私の構文が間違っていたのかもしれません。
しかし、別の方法で問題は無事解決できました。
ありがとうございます。
No.2
- 回答日時:
こんばんは。
いまいちよくわからないのと、Oracleのバージョンが不明なんですが・・・、
>なおかつ欲をいえば、MAX(適用日付)のIDが複数存在する場合は、
>1店舗CDにつき一つの適用日付を取得したいです。(この際、IDはなんでもいいです。)
これは無理じゃないですかね?
取得結果が何でもいいようなSQLは書けませんから・・・。
(MySQLなら可能ですが)
この辺りを精査して元データ、取得条件、希望の取得結果を補足して頂ければ可能です。
この回答への補足
ご回答ありがとうございます。
verは10.02です。
説明わかりにくくてすみません。
質問のテーブルデータでいえば、上から3番と最後の行のデータを2つ取得したいということです。
しかし、同じ適用日付と店舗CDでIDが違うデータが存在した場合、IDを一つに絞る方法がわからないということです。
説明になっているでしょうか?
かならず1店舗CDにつき一つの適用日付を取得したいんです。
そんな方法ないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 電子マネー・電子決済 PayPayのスターバックスクーポンの使い方 2 2022/10/22 13:10
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- ゴミ出し・リサイクル リサイクルショップへの買取依頼を取り消ししたい 2 2022/09/25 18:28
- クーポン・割引券 ドラッグストアの割引クーポンについて。 質問から先に。 ドラッグストア複数チエーンのアプリを入れてい 2 2022/12/09 07:35
- 英語 ①普通名詞の所有格+②普通名詞で、①普通名詞に定冠詞の意味を付加したい場合の表現方法等について 23 2022/09/30 12:47
- 転職 入社するに適した会社 以下のところに採用が決まっています。47歳独身男性です。過去の職歴は某コンビニ 3 2022/10/28 14:22
- 日本語 「店舗を展開」?「店舗で展開」? 6 2023/05/10 19:45
- 関東 東京に土地勘のあるのある方、お願いします!! 私は県外から所用で東京の上野に行くことになりました。そ 5 2023/05/29 12:17
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- SoftBank(ソフトバンク) ソフトバンクで得するサポート適用でiPhone13miniを分割ではらってますが、 iPhone13 1 2023/06/29 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
重複するIDのデータを1行にま...
-
Excelの並び替え(先頭の文字以...
-
日付書式に変換でこまっています!
-
SQLで部分的にGROUP BYしたいとき
-
SQLite3のtext→date変換について
-
エクセルの日付に時差を加算 #V...
-
Oracle10gのsql分についての質...
-
見たことのない形式で日付が表...
-
今日の日付が入った行のデータ...
-
エクセル 日付による並べ替え...
-
日数算出SQL
-
日付型なら変数の先頭になん...
-
Accessの数値から時間に変換す...
-
関数IFで、指定日付範囲のデー...
-
Excelグラフの日付軸の日付がず...
-
SQL/Loaderでの年月日時分秒の...
-
特定の日付が第何週目にあるか...
-
DB2のSQL(日付)について
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
今日の日付が入った行のデータ...
-
エクセルの日付に時差を加算 #V...
-
Accessの数値から時間に変換す...
-
エクセル 日付による並べ替え...
-
SQLサーバで和暦から西暦に変換...
-
SQLで部分的にGROUP BYしたいとき
-
重複するIDのデータを1行にま...
-
テーブルの主キーをdate型...
-
ExcelのSUMPRODUCTで日付の範囲...
-
WHERE句にて「30日前から今日ま...
-
yyyy/M/dをyyyy/MM/ddに変換
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
日付書式に変換でこまっています!
-
SQLite3のtext→date変換について
-
エクセルVBA 今日の日付行...
-
特定の日付が第何週目にあるか...
-
oracle 文字列 01:45 を時間に...
-
日付型なら変数の先頭になん...
-
Oracle10gのsql分についての質...
-
Excelグラフの日付軸の日付がず...
おすすめ情報