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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 今日の日付行...
-
今日の日付が入った行のデータ...
-
SQLサーバで和暦から西暦に変換...
-
23時59分59秒までのデータを抽...
-
Access VBAで行ラベルが定義さ...
-
Texの枠囲み調節
-
ODBCリンクの際にACCESSでは読...
-
エクセルVBAでUserFormを起動し...
-
VBA プロシージャの名前の取得
-
【Excel VBA】 WorksheetやRa...
-
excel/vba/public変数
-
sqlplusでヘッダーが付かない
-
EXCELでの時間計算(休憩時間の...
-
Accessのマクロでモジュールを...
-
DB2のSELECTでカンマ編集につい...
-
callで順に実行されるプロシー...
-
SQL*Loader フォーマット変換...
-
PL/SQLでSPOOLさせたいのですが...
-
会社の〇〇部と〇〇課の違いっ...
-
オラクルのデフォルトセッション数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLで部分的にGROUP BYしたいとき
-
Accessの数値から時間に変換す...
-
今日の日付が入った行のデータ...
-
重複するIDのデータを1行にま...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
SQLサーバで和暦から西暦に変換...
-
テーブルの主キーをdate型...
-
日付の切り出し方法について
-
日付書式に変換でこまっています!
-
oracle 文字列 01:45 を時間に...
-
日付型なら変数の先頭になん...
-
Excelグラフの日付軸の日付がず...
-
SQL/Loaderでの年月日時分秒の...
-
エクセル 日付による並べ替え...
-
ExcelのSUMPRODUCTで日付の範囲...
-
23時59分59秒までのデータを抽...
-
DB2のSQL(日付)について
-
excel 日付のみ置換したいのです
-
ACCESSでDate関数のエラーのついて
-
WHERE句にて「30日前から今日ま...
おすすめ情報