• ベストアンサー

SQLでの行の削除の仕方

個人ID  登録日  回数  検定日 1H62182  650410  1  660423 1H62182  650410  1  660525 1H62182  650410  1  660624 1H62182  680202  2  680204 1H62182  680202  2  680311 1H62182  680202  2  680408 1H62182  680202  2  680521 SQLでの行の削除の仕方に関して質問です。 上のようなデータに関して、 (登録日 ― 最初の検定日)>60日である場合、 その登録日内の以降の検定日もすべて削除したいのですが どのように書けばよいのでしょうか。 上の例では、『650410』に登録された人は、 『660423』に検定を受け、これは60日以上たっています。 ですから、回数が『1』の行をすべて消したいのです。 SQL初心者で、説明もうまくできないのですが、 よろしくお願いします。 使用しているのは、Postgres7.3です。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

削除のキーは、個人IDと登録日みたいなので、こんな感じに修正: select uid, regdate from T group by uid, regdate having min( examindate ) - regdate > 60;

gladiateur
質問者

お礼

アドバイスありがとうございます。 教えていただいた方法ですと、条件に一致した、uid(登録番号)とregdate(登録日)を抽出することができました。 そこで、 delete from totest where a in(select a,b from totest group by a,b having min(d)-b > 10) and b in(select a,b from totest group by a,b having min(d)-b >10); として、希望する行を削除しようとしましたが、以下のようなエラーが出てきました。 ERROR: Subselect has too many fields しかし、教えていただいた方法で、新たにテーブルを作り、それに一致する行を元のテーブルから削除すれば何とかなると思います。 ほんとうにありがとうございます。 SQLて奥が深いですね。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

削除のキーとなるのが、個人IDなら、 個人IDでグルーピングして、登録日の最大値と検定日の最小値の差が60以上の個人IDを抽出すれば、なんとかなるのでは。 こんな感じ: select uid from T group by uid having min(examinedate)-max(regdate)>60;

すると、全ての回答が全文表示されます。
  • mixjuice
  • ベストアンサー率14% (8/54)
回答No.2

DELETE FROM テーブル名 WHERE 回数=1 and(登録日 ― 最初の検定日)>60日 ); なんちゃって(^^;)自信ないです。

gladiateur
質問者

お礼

早速返事をくれて、ありがとうございます。 ちょっと、うまくいかないみたいでした。 下に、もう一度補足を書きましたので、 お暇であればまたよろしくお願いします。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

DELETE FROM テーブル名 where (登録日 ― 最初の検定日)>60日 and 登録日>検定日; 条件が よくわかんないのですが、 まず SELECT文で 削除したい行が抽出できるのを確認したら それを DELETE文の条件に入れたらいいです。 SELECT文は できますでしょうか?

gladiateur
質問者

補足

早速のご返事ありがとうございます。 説明不足の質問ですいません。 状況を少し説明すると 個人は登録を受けた後、数回の検定を受けます。しかし、登録後、最初の検定日が、登録から60日以上たったデータはその後も必要ないのですべて消したいのです。 つまり、下の★の部分で評価したいのです。 だから、group byで『登録日』などやるのかと思ったんですが、まったくわかりませんでした。 あと、私が間違っていたんですが (最初の検定日―登録日)>60でした。すいません。 個人ID  登録日  回数  検定日 1H62182  650410  1  660423 ★・・60日以上 1H62182  650410  1  660525 1H62182  650410  1  660624 ------------------------------- 1H62182  680202  2  680204 ★・・60日以内 1H62182  680202  2  680311 1H62182  680202  2  680408 1H62182  680202  2  680521 たとえるならば、レンタルビデオに入会して60日以内にレンタルしなかった人は、その後どんなに借りても削除したいといった状況です。 教えていただいた方法ではちょっとできなかったので、 またよろしければ教えてください。よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A