2010-10-06 4 views
2

Comment puis-je commander les données et puis le filtrer dans TSQL (SQL Server)?SQL - Ordre après le filtrage

J'ai essayé quelque chose comme ceci:

SELECT [Job].*, 
    ROW_NUMBER() OVER (ORDER BY [Job].[Date]) AS RowNum 
FROM [Job] 
ORDER BY Rank 
WHERE RowNum >= @Start AND RowNum < @End 

ne fonctionne pas. J'ai aussi essayé d'utiliser un sous-requête, qui jette:

La clause ORDER BY est invalide dans vues, fonctions en ligne, dérivées tables, des sous-requêtes et tables communes expressions, à moins que TOP ou FOR XML est aussi spécifié.

Je ne veux pas utiliser TOP ou FOR XML.

Comment résoudre ce problème?

Répondre

6

Utilisez un CTE. Notez que le "ORDER BY" interne dans ce cas est impliqué par le ROW_NUMBER/OVER.

;WITH cBase AS 
(
SELECT 
    [Job].*, 
    ROW_NUMBER() OVER (ORDER BY [Job].[Date]) AS RowNum 
FROM 
    [Job] 
) 
SELECT 
    * 
FROM 
    cBase 
WHERE 
    RowNum >= @Start AND RowNum < @End 
--ORDER BY 
    --output order 

Edit:

Votre recherche entre @Start et @End est sur la séquence générée par la ROW_NUMBER la date. Le rang n'a aucun lien avec cette séquence. Le rang (en supposant que c'est une colonne dans la table) sera ignoré parce que votre séquence est sur Date. Vous n'avez pas besoin de trier dessus. Si "rank" est en réalité "RowNum" alors vous n'avez toujours pas besoin d'un tri "interne" car c'est une opération de définition. Vous en aurez besoin sur le tri le plus superficiel.

Si le rang est une sorte secondaire à la date utilisez ceci:

ROW_NUMBER() OVER (ORDER BY [Job].[Date], [Job].[Rank]) AS RowNum 
+0

je commander par Rank premier, ** et ** sélectionner les enregistrements entre @Start et @End. C'est pour la recherche. –

+0

@TTT: voir ma modification s'il vous plaît. – gbn