2016-12-20 11 views
1

私はこのデータを取って、変換プロセスの一部として別のテーブルに挿入しています。残念ながら、ソースまたはターゲットのいずれかの場所でテーブルスキーマを変更することはできません。日付ロジックに基づくケースサブクエリ

私は、次のソースデータを持っています(もちろんデータのほんの小さなスナップショット)

Id StudentID Score Createdate 
1 1   86  2015-09-15 12:59:46.000 
2 1   89  2015-09-15 12:59:46.000 
3 1   76  2015-09-15 12:59:46.000 
4 1   91  2015-10-14 13:45:33.000 
5 1   87  2015-10-14 13:45:33.000 
6 1   78  2015-10-14 13:45:33.000 
7 1   88  2015-10-14 13:45:33.000 
8 2   78  2014-10-23 09:21:17.000 
9 2   82  2014-10-23 09:21:17.000 
10 2   83  2014-10-23 09:21:17.000 

私の最終的な結果対象データは次のようになります。基本的に

Id StudentID TestType Score Createdate 
1 1   Pretest  86  2015-09-15 12:59:46.000 
2 1   Pretest  89  2015-09-15 12:59:46.000 
3 1   Pretest  76  2015-09-15 12:59:46.000 
4 1   Posttest 91  2015-10-14 13:45:33.000 
5 1   Posttest 87  2015-10-14 13:45:33.000 
6 1   Posttest 78  2015-10-14 13:45:33.000 
7 1   Posttest 88  2015-10-14 13:45:33.000 
8 2   Pretest  78  2014-10-23 09:21:17.000 
9 2   Pretest  82  2014-10-23 09:21:17.000 
10 2   Pretest  83  2014-10-23 09:21:17.000 

発生ロジックを与えられた生徒のために、各データレコードの最も早い作成者が予備テストとみなされます。同じ生徒の場合、同じ作成者の後続のすべてのレコードもまた予備テストです。後で作成された同じ生徒のレコードについては、すべて後のテストとみなされます。

私は、おそらくinsert文のcase文を使用しています。これ以外にも、変換のために出てくる追加のデータ要素があります。

単純化のために、私のスクリプトは次のようになります。

INSERT INTO targettable 
(id, 
studentid, 
testtype, 
score, 
createdate) 
SELECT DISTINCT 
id   = sourcetable.id, 
studentid = sourcetable.studentid, 
testtype = CASE 
       WHEN ???? 
       END 
score  = sourcetable.score, 
createdate = sourcetable.createdate 
FROM sourcetable 

私の質問は、私はCREATEDATEに基づいて事前テスト/事後のテスト・タイプを決定するためのロジックを処理する方法が本当にわからない、です。

アイデア?事前

答えて

3

にあなたがdense_rank()またはrank()でこれを行うことができます

ありがとう:

select t.*, 
     (case when dense_rank() over (partition by studentId 
            order by cast(createdate as date) 
            ) = 1 
      then 'Pretest' 
      else 'Posttest' 
     end) as TestType 
from sourcetable t; 
+0

うわー。それは信じられないほど簡単で強力でした。それほどありがとう! –

関連する問題