Je sais pourquoi ça se passe mais je veux find un moyen de contourner cela si possible.
Par exemple, j'ai 4 lignes dans ma database et chacune a un datetime (qui sont tous différents). Ce que je veux faire, c'est get les 2 dernières lignes mais utiliser l'ordre croissant, de sorte que le plus ancien soit en haut du jeu de résultats.
J'utilise actuellement
SELECT TOP 2 * FROM mytable WHERE someid = @something ORDER BY added DESC
Cela me donne les lignes correctes mais dans le mauvais ordre. Si je change le DESC en ASC, il obtient le bon ordre, mais les deux plus anciennes des quatre lignes. Tout cela a du sens pour moi, mais y a-t-il un moyen de contourner le problème?
EDIT: Résolu avec la réponse d'Elliot ci-dessous. La syntaxe ne fonctionnerait pas sans définir un alias pour la table dérivée. Voici le résultat
SELECT * FROM (SELECT TOP 2 * FROM mytable WHERE someid = @something ORDER BY added DESC) AS tbl ORDER BY tbl.added ASC
Je pense qu'une solution brutale serait:
SELECT * FROM (SELECT TOP 2 * FROM mytable WHERE someid = @something ORDER BY added DESC) ORDER BY added
Cela permettra "top 2 par quelque chose" avec un PARTITION BY ajouté à la clause OVER
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY added DESC) as rn FROM mytable WHERE someid = @something ) foo WHERE rn <= 2 ORDER BY added
Notez que la table dérivée nécessite un alias