以下のテーブルがあります。
table
ID key code cls add_date
-- ---- ----- ---- ----------
1 0001 A01 0 2013/01/01
2 0001 A01 0 2013/01/15
3 0001 B01 0 2013/02/01
4 0002 C01 0 2013/01/20
5 0003 XYZ01 0 2013/01/10
6 0003 XYZ01 0 2013/01/20
:
このテーブルからkey、codeが重複したものを除いて、一意となる日付が最新のを
取り出したいのですがSQLをどのようにすればよいか教えてください。
結果:
2 0001 A01 0 2013/01/15
3 0001 B01 0 2013/02/01
4 0002 C01 0 2013/01/20
6 0003 XYZ01 0 2013/01/20
分析関数、相関関数を使うのでしょうか。
使わなくてもできるのでしょうか。
今後の為に、両方を教えてください。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
NOT EXISTSを使う方法もあります。
SELECT id, key, code, cls, add_date
FROM table t1
WHERE NOT EXISTS (
SELECT *
FROM table t2
WHERE t1.key = t2.key
AND t1.code = t2.code
AND t1.add_date < t2.add_date
);
分析関数を使うなら、
SELECT id, key, code, cls, add_date
FROM (
SELECT id, key, code, cls, add_date, ROW_NUMBER() OVER(PARTITION BY key, code order by add_date desc) rnum
FROM table
)
WHERE rnum = 1;
といった感じでしょうか。
No.3
- 回答日時:
このような問題は、何段階かに分けて考えると、すっきりします。
まず、同じグループの中で、最大の日付はなにか?という問いを解きます。
select max(add_date) from table group by key, code
となります。
次に、各グループで、この最大の日付を持つレコードはどれですか?と続けます。先のSQLが最大の値としてそのまま使えますから、
select max(t1.id), t1.key, t1.code, max(t1.add_date)
from dbo.table1 t1
where t1.add_date =
(select max(t2.add_date) from dbo.table1 t2 where t2.key=t1.key and t2.code=t1.code)
group by t1.key, t1.code
ここで、group byは、外側のselect文に移行しています。その代わり、外側の見ているkey,codeが内側のkey,codeと一致するように内側のselect文にwhere句を付け加えます。これは、外側のselect文と内側のselect文は、同じグループを参照して集計する必要があるからです。
外側のselect文のselect句で、idとadd_dateにmaxが付いている理由は、group byを使用したための構文上の逃げです。今回の質問が意味をなすデータが入っているとすれば、idもadd_dateも一意に決まるはずなので本来はいらないのですが、これをつけないと、システムに怒られます。group byを使用した時に、select句で使えるフィールドは、group by で指定したフィールドか集計項目だけと、構文規則で決まっているからです。ちなみに、一つのデータのmaxは、やはり元のデータですから、値としては影響がありません。minでもかまいません。値は同じですから。
実は、このSQL、keyとcodeとmax(add_date)の組み合わせが一意であることを利用すると、もう少し簡単になることが解ります。外側で、group by key,code としていますが、一意であるならグループを組む価値がないわけです。
そこで、group byをとってしまうと、
select id, key, code , cls, add_date from table t1
where t1.add_date = (select max(t2.add_date) from table t2 where t1.key=t2.key and t1.code=t2.code)
order by t1.id
余分なmaxも消えました。最後のorder by はおまけです。
これで、できあがり。
慣れてくると、分割しなくても、すっと出てくるようになります。
ある項目の最大のデータを持つレコードに対して・・・・と言った場合は、同じ考え方でSQLを組んでいけます。履歴を持ったテーブルを検索する時に、この類の問題は良く出ます。
No.1
- 回答日時:
select key,code,max(add_date)
from table1
group by key,code
order by key,code
で、key,code別の日付の最大値が求められます。
(order by key,codeはkey,code順に表示させています。)
idとclsは、上記の情報から検索しないといけません。
例えば、
select * from table1
where (key,code,add_date) in
(select key,code,max(add_date)
from table1
group by key,code
)
order by key,code,id
というような感じ。
ただし、idでユニークと思われるので、
同一key,code,add_dateのidが複数あれば、複数でてきます。
(key,code,add_dateでユニークキーを定義してあればでてきませんが。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sqlのwhere句で下記の条件にし...
-
orace SQL文のエラー(ORA-0092...
-
64bit端末でのOLEDB接続に関して
-
副問合せにLIKE文を使う方法は...
-
osqleditについて
-
CASLⅡ 文字データから数値デー...
-
バッチファイルで複数フォルダ...
-
oracleのimpdpでORA-39166
-
データベースのカラムの型がCHA...
-
SQL 2つのテーブルとSUBSTRING...
-
sqlplusで接続できない
-
オラクル試験でのクラムメディ...
-
Oracle で文字列からタイムスリ...
-
【SQL】IN句内のサブクエリが重...
-
棒読みちゃんが起動できないの...
-
sqlで質問です。 Aテーブルは店...
-
SQLの中上級者へのレベルアップ...
-
SELECTによる表の変換方法を教...
-
開発対象となるアプリケーショ...
-
質問です。 下記のテーブルとデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
1文で最大値を求める方法
-
エクセルの外部データ取り込み...
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
count関数の値をwhere句で使用...
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
2つの列が同じ値の行を取得するSQL
-
レコードの登録順がおかしい
-
<SQL>重複しているデータの場合...
-
AccessのSQL文で1件のみヒット...
-
where句中のtrim関数について
-
アクセスのレポートでレコード...
-
複数のテーブルから値を合計出...
-
エクセル、並び替え正しくソー...
-
Oracleで「文字が無効です」の...
-
group byの並び順を変えるだけ...
-
引数によってwhere句を切り替え...
おすすめ情報