Vous avez quelques options
SELECT DOC_NAME
FROM DOCUMENTS
WHERE DELIVERY_TIMESTAMP IN (
SELECT MAX(DELIVERY_TIMESTAMP)
FROM DOCUMENTS
)
Ou avec joint
SELECT DOC_NAME
FROM DOCUMENTS
INNER JOIN (
SELECT MAX(DELIVERY_TIMESTAMP) AS MAX_DELIVERY_TIMESTAMP
FROM DOCUMENTS
) AS M
ON M.MAX_DELIVERY_TIMESTAMP = DOCUMENTS.DELIVERY_TIMESTAMP
Il est plus compliqué s'il y a des doublons dans un horodatage ou vous avez besoin de plusieurs colonnes dans votre « max » critères (parce que MAX()
est seulement sur la colonne pour toutes les lignes)
C'est là l'option JOIN
est la seule option disponible, car une construction comme celui-ci ne sont pas disponibles (dire plusieurs commandes avec horodatage identique):
SELECT DOC_NAME
FROM DOCUMENTS
WHERE (DELIVERY_TIMESTAMP, ORDERID) IN (
SELECT TOP 1 DELIVERY_TIMESTAMP, ORDERID
FROM DOCUMENTS
ORDER BY DELIVERY_TIMESTAMP DESC, ORDERID DESC
)
Si vous en fait, devez faire:
SELECT DOC_NAME
FROM DOCUMENTS
INNER JOIN (
SELECT TOP 1 DELIVERY_TIMESTAMP, ORDERID
FROM DOCUMENTS
ORDER BY DELIVERY_TIMESTAMP DESC, ORDERID DESC
) AS M
ON M.DELIVERY_TIMESTAMP = DOCUMENTS.DELIVERY_TIMESTAMP
AND M.ORDERID = DOCUMENTS.ORDERID
Cade, j'allais répondre avec la solution JOIN, puis j'ai inspecté le plan d'exécution pour chaque technique. Sql Server 2005 (le DB que j'ai à portée de main) utilise le même plan d'exécution pour chaque syntaxe. Donc Paul, vous avez le choix entre ... et les performances ne souffriront pas –
Oui, l'optimiseur dans SQL Server est très bon. Je vais modifier ma réponse pour noter que la solution JOIN est la seule qui fonctionne quand vous avez un tuple MAX. –
Merci beaucoup! –