我有一张不同周的考试成绩表。我想创建一个分数差异的额外列,比如如果分数减少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
谢谢你
答案 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;
捕获结果并显示如下:
答案 2 :(得分:0)
考虑进一步的标准化步骤。将分数保存在单独的表格中。将学生与分数表相关联。
您必须决定如何引用之前的分数以与当前分数进行比较。如果您创建一个附加字段来存储上次评分的更改,那么您可以使用显示当前评分的计算字段,或者将先前评分存储在新评分旁边的字段中,然后使用计算字段显示更改两者之间。