Найти последние данные (статус) с указанием даты и времени - PullRequest
0 голосов
/ 20 января 2020

Я застрял в ситуации, когда у меня есть данные типа

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

Мне нужно найти, когда ученик получил последний 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

, но мне нужно найти, когда студент меняет свое lastResultStatus время.

Ответы [ 2 ]

1 голос
/ 20 января 2020

Вы можете использовать LAG , чтобы получить значение из предыдущего ряда и сравнить с текущим. Мы используем PARTITION для группировки результатов по студентам и упорядочения по 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
0 голосов
/ 20 января 2020

Опираясь на ответ @ gotqn, чтобы получить самую последнюю дату изменения статуса студента:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...