2016-11-23 12 views
0

生徒データベースに49列のテーブルがあります。すべての生徒に一意のIDが割り当てられます。日付の他の2つの列があります。 date1には、レコードがデータベースに挿入された日付が入ります。生徒がコースに登録した日付を示す別の列の日付2があります。また、学期中に学生の登録が複数回処理されるため、異なる日付の学生が複数登録されます。私はテーブルから重複を削除したい。同じデータで日付が異なるレコードを削除する方法

表は、私は用語が「2012夏」、「2012年秋」、「2012年春」であり、日付1とdate2のが最もあり、ID 1のすべてのレコードを選択する必要があり、この

id   Date1  Date2  TERM_CODE TERM 
1  2016-07-06 2011-11-01 201210  2012 Spring 
2  2016-07-06 2011-11-17 201210  2012 Spring 
4  2016-07-06 2011-11-17 201210  2012 Spring 
3  2016-07-06 2011-11-17 201210  2012 Spring 
1  2016-07-16 2011-11-09 201210  2012 Spring 
2  2016-07-16 2011-11-17 201210  2012 Spring 
1  2016-07-16 2011-11-01 2Summer 
1  2016-07-06 2011-11-13 2Summer 
1  2016-07-16 2011-11-03 201260  2012 Fall 
1  2016-07-06 2011-11-17 201260  2012 Fall 

に似ています最近更新された

+0

[Dedupeと最新のタイムスタンプを持つレコードを保持する]の可能な複製(http://stackoverflow.com/questions/24467428/dedupe-and-retain-record-withmost-recent-timestamp) –

答えて

1

説明から、私は最近更新された手段はdate2だと思います。その場合、1つの方法は、ウィンドウ関数を使用しています。

select t.* 
from (select t.*, 
      row_number() over (partition by id order by date2 desc, date1 desc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

これは、学生が同じdate2を持つ複数の行があっても、idごとに1行だけを保証します。

より伝統的なSQL方法:生徒が同じdate2値を持つ複数のレコードを持っていた場合

select t.* 
from t 
where t.date2 = (select max(t2.date2) 
       from t t2 
       where t2.id = t.id); 

は、重複を返します。

+0

チャーム!本当にありがとう。また、私はそのようなテーブルがたくさんあります。私は重複していないし、多くのテーブルから1つのテーブルに完全なデータを保存する必要があります。この点について別のシナリオ –

+0

。私はデータを重複しなくてはならず、別の用語で表から2つのレコードを選択する必要があります。テーブルは次のようになります。 id日付1日付2期間番号期間 1 2016-07-06 2011-11-01 201210 2012春 2 2016-07-06 2011-11-17 201210 2012春 1 2016-07- 16 2011-11-13 201260 2012秋 1 2016-07-16 2011-11-17 201260 2012年秋 今、2012年春と2012年のmax(date2)と期間を持つすべてのレコードを選択する必要がありますid1のために落ちる。 –

+1

@AbdulFattahMohammed。 。 。別の質問がある場合は、質問として質問する必要があります。 –

関連する問題