|
分類:[C#]
■No7888に返信(くし&しも さんの記事) > いつもお世話になります。 > > 例えば下記のようなテーブルがあるとします。 > Primary Key はcode_aとnoとno_edaです。 > そこでcode_aとno毎にno_edaが古い番号のデータを取得するとします。 > よって、結果からいえば下記テーブルから「○」がついたレコードを取得したいのですが、一発で取得するようなSQLがどうもうまく作れませんでした。 > ちなみに全ての列のデータを取得します。 > > SELECT DISTINCT code_a, no FROM tbl_A だったら重複行は絞れますが、no_edaもnameも取得できません。 > 又、SELECT DISTINCT code_a, no, no_eda FROM tbl_A だったら逆にcode_a, no,no_edaで一意となるので本来の意図したデータを取得できなく、 > nameも取得できません。 > > テーブル名:tbl_A > ------------------------------------ > code_a | no | no_eda | name | ← 列名 > ------------------------------------ > 000 | 0000 | 0 | あ | > ------------------------------------ > 000 | 0000 | 1 | い | > ------------------------------------ > 000 | 0000 | 2 | う | ○ > ------------------------------------ > 000 | 0001 | 0 | お | > ------------------------------------ > 000 | 0001 | 1 | か | ○ > ------------------------------------ > 100 | 0000 | 0 | き | > ------------------------------------ > 100 | 0000 | 1 | く | ○ > > もし一度に取得するようなSQLが作れるとしらお手数ですが教えてください! > > 環境等はWindows XP, Visual Studio2005, Oracle10g ,C# です。 > 以上よろしく御願い致します。
簡単にいうと code_a、no毎でno_edaが最大値を持つレコードを取得したいってことですかね? #古いno_edaというのが最大値のno_edaという意味なのかな?と思ったので #確認させていただきました。
Oralceなので以下のSQLがかけますね。 #ここは集計関数のMAXです。 select * from table_a where (code_a, no, no_eda) in ( select code_a, no, max(no_eda) from table_a group by code_a, no ) ;
またはお題にあるDISTINCTを使うとして以下のパターンもかけますね。 #ここでは分析関数のMAXを使用しています。 select * from table_a where (code_a, no, no_eda) in ( select distinct code_a, no, max(no_eda) over (partition by code_a, no ) from table_a ) ;
|