Tableau # Rendez-vous:
ID, Name, LocationID, Created
Actuellement j'ai:
SELECT * FROM Appointments WHERE Created <= @today ORDER BY ID
Le problème est qu'il y a des fois où il y a plus d'une ligne pour un ID de localization donné , et dans ce cas, je veux returnner celui avec la date la plus récente.
À quoi ressemblerait la requête?
Vous n'avez pas mentionné la version de SQL Server que vous utilisez, mais si vous utilisez 2005 ou une version plus récente, vous pouvez utiliser une expression CTE (Common Table Expression) avec la fonction ROW_NUMBER
:
DECLARE @today DATETIME = ......... ;WITH LastAppt AS ( SELECT ID, Name, LocationID, Created, ROW_NUMBER() OVER(PARTITION BY LocationID ORDER BY Created DESC) AS 'RowNum' FROM dbo.Appointments WHERE Created <= @today ) SELECT ID, Name, LocationID, Created FROM LastAppt WHERE RowNum = 1 ORDER BY ID
Ce CTE "partitionne" vos données par LocationID
, et pour chaque partition, la fonction ROW_NUMBER
dissortingbue des nombres séquentiels, commençant à 1 et ordonné par Created DESC
– ainsi la dernière rangée obtient RowNum = 1
(pour chaque ID
) qui est ce que je sélectionne à partir du CTE dans l'instruction SELECT après.
Le problème que vous posez est impossible.
Si votre clause WHERE
spécifie:
WHERE Created = @today
Ensuite, par définition, toutes vos lignes auront des champs Created
IDENTIQUES .
Y a-t-il un autre champ que vous voulez utiliser pour cela?