2016-12-20 28 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 

本质的逻辑发生对于给定的学生来说,每个数据记录的最早创建者被​​认为是预测试。对于同一个学生,同一个创建者的任何和所有后续记录也是预测试。对于后来创建的同一个学生的任何记录,他们都被认为是后测。

我可能会在插入语句中使用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前测/后测testtype。

任何想法?

在此先感谢

回答

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

哇。这非常简单,超级强大。对此感激不尽!! –