質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

467閲覧

履歴テーブルの条件洗出し(SQL文の質問)

yamaguti

総合スコア185

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/09/21 04:44

お世話になっております。

作成している商品管理システムに、履歴テーブルがあるのですが
システムのバグで最終履歴にlast_FLGが立っていない商品があります。

同じ商品CDで処理日が最新なのに、last_flgが立っていないデータを抽出したいのですが、下記の考え方で問題ございませんでしょうか、ご教示の程宜しくお願い致します。

sql(私のほうで考えたクエリ)

1select 商品コード,max(処理日) 履歴テーブル 2where 3LAST_FLG = 0 4group by 5 商品コード,max(処理日)
商品コード,処理日,処理,LAST_FLG 10552,2017/01/01,店舗移動,1 10552,2017/02/01,売上,0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

window関数のrow_numberを用いて抽出できると思います。

sql

1 2SELECT 3 商品コード 4 FROM 5 ( 6 SELECT 7 商品コード 8 ,row_number ( 9 ) OVER ( 10 partition BY 商品コード 11 ORDER BY 12 処理日 DESC 13 ) AS num 14 FROM 15 履歴テーブル 16 ) 17 WHERE 18 num = 1 19 AND last_flg = 0

投稿2017/09/21 05:29

ysmz

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちょっと違いますね。
提示のSQLは、「last_flg=0のデータで、商品コードごとの最大の処理日」ですから、対象以外のものも含まれることになります。

以下は、「商品コードごとの最大の処理日のもののうち、last_flg=0のもの」になります。

SQL

1select * 2from 履歴テーブル t1 3where 処理日=(select max(処理日) from 履歴テーブル where 商品コード=t1.商品コード) 4 and LAST_FLG = 0 5

投稿2017/09/21 05:19

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これでどうでしょうか

select 商品コード,処理日 from 履歴テーブル h1 where not exists( select * from 履歴テーブル h2 where h2.商品コード = h1.商品コード and h2.処理日 > h1.処理日 ) and LAST_FLG = 0

投稿2017/09/21 05:43

galerius

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2017/09/21 06:03

これだと、処理日の最大のものの抽出にはならず、当該レコードに以降の処理日が存在するものになります。
galerius

2017/09/21 06:06

not existsですけど、そうなります?
sazi

2017/09/21 06:07

あ、失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問