Requête SQL: Tentative de tirer le plus récent avec d'autres parameters

Je travaille dans un système scolaire avec des données d'étudiants dans une database. Au less chaque année (et parfois plusieurs fois par an) une nouvelle ligne de données est créée pour cet étudiant qui représente un nouveau "document". J'essaie d'écrire une requête pour extraire la plus récente rangée d'informations pour cet étudiant si cette ligne répond à d'autres critères (par exemple, il doit être de type 'compsped' et il doit avoir le statut 'F' ou 'I' '). Quand j'exécute la requête que j'ai écrite ci-dessous, ça marche plutôt bien, mais il semble qu'il manque des données. Je pense que la raison pour laquelle certaines données sont manquantes, c'est parce que l'on cherche d'abord le document le plus récent et ensuite, il filter les documents qui ne répondent pas aux autres critères. Au lieu de cela, je veux d'abord filterr les documents qui ne répondent pas aux autres critères et de cette list, je veux qu'il tire la ligne la plus récente de cette list. Nous utilisons SQL Server 20016. J'espère que cela a du sens. S'il vous plaît poser des questions si ce n'est pas le cas. Merci!

SELECT evaluationreports1.Status, evaluationreports1.EvalDueDate, evaluationreports1.EvalRptDate, evaluationreports1.StudentID, evaluationreports1.TypeAbbrev FROM PlansAnoka.dbo.evaluationreports evaluationreports1 WHERE evalrptdate = (select max(evalrptdate) from evaluationreports where studentid = evaluationreports1.studentid) AND (evaluationreports1.TypeAbbrev='CompSpEd') AND (evaluationreports1.Status In ('F','I')) 

Cette modification de votre requête existante fonctionnerait:

 SELECT evaluationreports1.Status, evaluationreports1.EvalDueDate, evaluationreports1.EvalRptDate, evaluationreports1.StudentID, evaluationreports1.TypeAbbrev FROM PlansAnoka.dbo.evaluationreports evaluationreports1 WHERE evalrptdate = ( select max(evalrptdate) from evaluationreports i where i.studentid = evaluationreports1.studentid and i.TypeAbbrev='CompSpEd' and i.Status In ('F','I') ) 

Une autre façon de le faire serait d'utiliser row_number()

with common_table_expression as () utilisant row_number()

 with cte as ( select * , rn = row_number() over ( partition by studentid order by evalrptdate desc ) from PlansAnokt.dbo.evaluationreports t where t.TypeAbbrev='CompSpEd' and t.Status in ('F','I') ) select * from cte where rn = 1 

ou sans le cte

 select * from ( select * , rn = row_number() over ( partition by studentid order by evalrptdate desc ) from PlansAnokt.dbo.evaluationreports t where t.TypeAbbrev='CompSpEd' and t.Status in ('F','I') ) as cte where rn = 1