- ベストアンサー
SQLite3で重複レコードの削除と最新日付の保持方法
- SQLite3のクエリを使用して、重複レコードを削除し、最新の日付のみを保持する方法を教えてください。
- 例えば、与えられた構造のテーブルにおいて、keyごとに最新のyearとmonthを持つレコードのみを残す方法を教えてください。
- 上記の例のテーブルをクエリ実行した結果は次の通りです。 1 , aaa, 2000,12, 1000 3 , bbb, 2001, 4, 500 6 , ccc, 2001, 8, 200
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
削除対象テーブルとの相関クエリがだめなのかな?先にid のリストが確定すれば大丈夫かな? delete from keys where id not in ( select id from keys t0 where exists ( select * from (select key, max( year*100+ month ) as max_ym from keys group by key ) as t1 where t0.key=t1.key and t0.year = round( t1.max_ym / 100 ) and t0.month=t1.max_ym % 100 ) );
その他の回答 (1)
- mpro-gram
- ベストアンサー率74% (170/228)
まずは残す行を見つけるselect文が出来れば、 where id not in () とか where not exists () で、不要なid行を削除できる。 delete from `tbl` t0 where not exists ( select * from (select key, max( year*100+ month ) as max_ym from `tbl` group by key ) as t1 where t0.key=t1.key and t0.year = round( t1.max_ym / 100 ) and t0.month=t1.max_ym % 100 ) ; 実行チェックはしてないけど、これでどうかな?
補足
Error: near "t0": syntax errorです。以下のように入力しました。table name はkeysです。t0をkeysにしてもだめですね。うーん。 delete from keys t0 where not exists (select * from (select key,max(year*100+month) as max_ym from keys group by key) as t1 where t0.key = t1.key and t0.year=round(t1.max_ym/100) and t0.month=t1.max_ym % 100;
お礼
遅れました。 ありがとうございます。これで行きました! すばらしいです^^
補足
keyグループごとに最大値を振って、 条件に合わないものを消してる感じになるのですかね。) 条件の解釈が難しいですね。