- ベストアンサー
SQLで日付の最大値レコードを取得する方法
- SQLを使用して、テーブルから日付の最大値を持つレコードを取得する方法について解説します。
- 最大値を持つレコードを取得するためには、サブクエリを使用して最大日付と最大順序を取得し、その条件で検索する必要があります。
- 社員ごとの最大日付の最大順序を持つレコードを取得するためには、社員番号と最大値の条件を組み合わせて検索します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
WINDOW関数が使えるなら SELECT 社員番号, 社員名, 日付, 順序 FROM ( SELECT *, ROW_NUMBER() OVER( PARTITION BY 社員番号 ORDER BY 順序 DESC ) RN FROM テーブル ) WHERE RN = 1 ORDER BY 社員番号;
その他の回答 (4)
- baunce
- ベストアンサー率66% (2/3)
ANo.4のbaunceです。すみません。 他の方が回答されている事に気づきませんでした。 nora1962さんの回答と同じでした。 nora1962さんごめんなさい 大変失礼しました。
- baunce
- ベストアンサー率66% (2/3)
こんばんは。 私も先ほどこちらに質問させていただいたのですが、 私にも回答できそうな質問があったので協力させていただきます。 ◇まずは検証データ作成。 create table EX001 ( C1 number, c2 varchar2(8), c3 date, c4 number ); insert all into ex001(c1,c2,c3,c4) values(100,'AAA',to_date('2011/0501'),2) into ex001(c1,c2,c3,c4) values(100,'AAA',to_date('2011/0501'),1) into ex001(c1,c2,c3,c4) values(100,'AAA',to_date('2011/0401'),1) into ex001(c1,c2,c3,c4) values(200,'BBB',to_date('2011/0401'),2) into ex001(c1,c2,c3,c4) values(200,'BBB',to_date('2011/0401'),1) select 'X' from dual; commit; ◇回答SQL select * from ( select c1,c2,c3,c4,row_number() over (partition by c1 order by c3 desc,c4 desc) jyun from ex001 order by c2,jyun ) t where t.jyun = 1; C1 C2 C3 C4 JYUN ---------- -------- -------- ---------- ---------- 100 AAA 11-05-01 2 1 200 BBB 11-04-01 2 1 これでどうでしょうか? とりあえず意図する行は返ると思いますが、 一社員の中で1位が2レコードあった場合などは 考慮できてないです。
- root139
- ベストアンサー率60% (488/809)
「同じ社員番号で、後の日付のデータが無く、同じ日付でより大きい順序のデータも無いもの」という条件を相関サブクエリを使って表現すればよいかと。 例) --------------------------------------------- SELECT * FROM テーブル名 e1 WHERE NOT EXISTS( SELECT * FROM テーブル名 e2 WHERE e1.社員番号 = e2.社員番号 AND (e1.日付 < e2.日付 OR e1.日付 = e2.日付 AND e1.順序 < e2.順序) ); --------------------------------------------- ちなみに社員番号でグループ化して、日付と順序のMAXを取得した場合は、日付と順序おのおのの最大値が返されるため、期待されるものと違う結果になるかも知れません。 -------------------------- | 100 | AAA | 2011/05/01 | 2 | -------------------------- | 100 | AAA | 2011/05/01 | 1 | -------------------------- | 100 | AAA | 2011/04/01 | 3 | -------------------------- | 100 | AAA | 2011/04/01 | 2 | -------------------------- | 100 | AAA | 2011/04/01 | 1 | -------------------------- このような状態だった場合、グループ化する方法だと下記の様な結果になります。 -------------------------- | 100 | AAA | 2011/05/01 | 3 | --------------------------
- tohru999
- ベストアンサー率49% (76/154)
こういうことでしょうか? SELECT 社員番号 , 社員名 , MAX(日付) , MAX(順序) FROM テーブル名 GROUP BY 社員番号 , 社員名