お世話になります
重複する項目のある複数のデータが入ったテーブルから、条件を満たすレコードのうち、重複を避けつつ、各々の最新のものだけを取り出すSQLを考えています。
単純な構成の具体例を示すと次のとおりです。
create table test ( id int, name char(4), msg char(4), suji int);
insert into test values(11, ’TARO’, ‘wwww’, 4);
insert into test values(11, ’TARO’, ‘xxxx’, 3);
insert into test values(11, ’HANA’, ‘’yyyy’, 4);
insert into test values(11, ’HANA’, ‘’zzzz’, 3);
insert into test values(10, ’TARO’, ‘ssss’, 2);
insert into test values(10, ’TARO’, ‘tttt’, 1);
insert into test values(10, ’HANA’, ‘’uuuu’, 2);
insert into test values(10, ’HANA’, ‘’zzzz’, 1);
このとき、idが11でかつ、sujiが最も大きいものを、TAROとHANAそれぞれで1つずつ取得したいです。(この例だと「11, ‘TARO’ ,wwww’」と「11, ‘HANA’ ‘yyyy’」の2レコード取れれば良い)
sujiは文法を確認するためのサンプルで、実際にはsujiに日付が入り、最も新しい日付のレコードをSELECTすることを想定しています。また、これはさらにこのあと10と11の差分をみてcase文で条件分岐するような処理も加わるとても大きなSQLの一部です。
たとえばselect * from ( select * from test where id = 11) a;
とすることでidが11の4レコードまで絞り込むことができるのはわかりますが、ここから絞り込めなくて困っています。
SQLにこだわらずVBAやPython等を介せば自力でも解決できるのですが、クライアントの要望としてSQLでデータをを成形して取り出したいようです。
GROUP BYとORDER BYの組み合わせで実現できないだろうかと考えていますが、プロジェクトの都合でひとりで考え込む時間があまりなく、現場でSQLの読み書きができるのが自分だけということで、相談できる人がいません。どうかお力をお貸しください。
postgreSQLを使用しています。よろしくお願いします。