Reputation: 1
I am stuck in situation in which I have a data like
studentId Marks marksgotOn
1 10 2019-12-01
1 10 2019-12-01
2 35 2019-12-02
3 35 2019-12-02
4 90 2019-12-03
I need to find when student got last marksGotOn
SELECT StudentId, CASE WHEN Marks BETWEEN 0 AND 10 THEN 'Fail'
WHEN Marks BETWEEN 30 AND 35 THEN 'Pass'
WHEN Marks >=90 THEN 'Excellent' ELSE '' END AS ResultStatus
FROM Student
but I need to find when student change their lastResultStatus
time.
Upvotes: 0
Views: 45
Reputation: 193
Building on @gotqn's answer, in order to get the latest date on which a student's status changed:
WITH DataSource AS
(
SELECT StudentId
,CASE WHEN Marks BETWEEN 0 AND 10 THEN 'Fail'WHEN Marks BETWEEN 30 AND 35 THEN 'Pass' WHEN Marks >=90 THEN 'Excellent' ELSE '' END AS ResultStatus
,marksGotOn
FROM Student
)
,
GradeChanges as
(
SELECT *
,IIF(LAG(ResultStatus) OVER(PARTITION BY StudentId ORDER BY marksGotOn) <> ResultStatus, 'Changed', 'Not Changed') as GradeChange
FROM DataSource
ORDER BY StudentId
,marksGotOn
)
select
StudentId,
max(marksgotOn) as LastGradeChange
where
GradeChange = 'Changed'
group by
StudentId
Upvotes: 0
Reputation: 43626
You can use LAG to get the value from the previous row and compare with current one. We are using PARTITION
to group the results by student and ordering by marksGotOn
.
WITH DataSource AS
(
SELECT StudentId
,CASE WHEN Marks BETWEEN 0 AND 10 THEN 'Fail'WHEN Marks BETWEEN 30 AND 35 THEN 'Pass' WHEN Marks >=90 THEN 'Excellent' ELSE '' END AS ResultStatus
,marksGotOn
FROM Student
)
SELECT *
,IIF(LAG(ResultStatus) OVER(PARTITION BY StudentId ORDER BY marksGotOn) <> ResultStatus, 'Changed', 'Not Changed')
FROM DataSource
ORDER BY StudentId
,marksGotOn
Upvotes: 1