在SQL

时间:2016-08-11 17:46:41

标签: sql sql-server tsql

我有一张不同周的考试成绩表。我想创建一个分数差异的额外列,比如如果分数减少0-5然后是1,5-9然后是2,10 +然后3然后如果分数增加然后是4.这是我和我一起的样本数据在表中。

--DROP TABLE #Scores
CREATE TABLE #Scores (
    NAME varchar(10),
    Grade varchar(10),
    Subject varchar(25),
    Exam_Date datetime,
    Score int
)

INSERT INTO #Scores
    VALUES ('Sam', 'XI', 'Maths', '2016-08-01 15:47:29.533', 38), 
           ('Sam', 'XI', 'Maths', '2016-07-25 15:47:29.533', 50), 
           ('Mike', 'XI', 'Maths', '2016-08-01 15:47:29.533', 50), 
           ('Mike', 'XI', 'Maths', '2016-07-25 15:47:29.533', 45)

SELECT * FROM #Scores

谢谢你

3 个答案:

答案 0 :(得分:1)

您可以使用lag()case

select s.*,
       (case when score - prev_score < 0 then 4
             when score - prev_score <= 5 then 1
             when score - prev_score <= 9 then 2
             else 3
        end) as score_diff
from (select s.*,
             lag(score) over (partition by name, subject order by exam_date) as prev_score
      from #scores s
     ) s;

答案 1 :(得分:1)

感谢@Gordon Linoff,我稍微更改了代码。逻辑是正确的,只需稍微改变数学。

select s.*,
       (case when score - prev_score > 0 then 4
             when score - prev_score between -5 and 0 then 1
             when score - prev_score between -9 and -5 then 2
             else 3
        end) as score_diff
from (select s.*,
             lag(score) over (partition by name, subject order by exam_date) as prev_score
      from #scores s
     ) s;

捕获结果并显示如下:

enter image description here

答案 2 :(得分:0)

考虑进一步的标准化步骤。将分数保存在单独的表格中。将学生与分数表相关联。

您必须决定如何引用之前的分数以与当前分数进行比较。如果您创建一个附加字段来存储上次评分的更改,那么您可以使用显示当前评分的计算字段,或者将先前评分存储在新评分旁边的字段中,然后使用计算字段显示更改两者之间。