我有一张表,上面有不同星期的考试成绩。我想创建一个带有分数差异的额外列,比如如果分数减少了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感谢您的支持
发布于 2016-08-12 01:55:34
您将使用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;发布于 2016-08-12 04:23:37
感谢@戈登·林诺夫,我稍微修改了一下代码。逻辑是正确的,只是稍微改变一下数学。
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;结果被捕获并显示如下:

发布于 2016-08-12 01:55:58
考虑进一步的标准化步骤。将分数保存在单独的表中。将学生与分数表相关联。
您必须决定如何引用以前的分数与当前分数进行比较。如果您创建了一个附加字段来存储上次分数的更改,则可以使用显示当前分数的计算字段,或者将上一个分数与新分数一起存储在字段中,然后使用计算字段显示两者之间的更改。
https://stackoverflow.com/questions/38902938
复制相似问题