8
votes

Utilisation de la colonne dérivée de la fonction de classement dans la clause (SQL Server 2008)

En espérant que cela est trivial pour un SQL-Ninja ... essayé d'obtenir la requête suivante:

Ceci est pour SQL Server 2008 P>

SELECT 
    ROW_NUMBER() OVER (ORDER BY Date_Time DESC) AS RowNumber, *
FROM
    (SELECT 
         T.A_ID, T.User_Name, T.Date_Time, T.Value,
         U.ID, U.Name, U.Field1, U.Field2,
         COUNT(U.ID) OVER () AS TotalRows
     FROM 
        TeeTable as T 
    INNER JOIN 
        YouTable AS U ON T.U_ID = U.ID
    WHERE 
        T.Value BETWEEN 222 AND 225) Filtered
WHERE 
    RowNumber BETWEEN 1 AND 5


1 commentaires

Évitez la balise MSSQL car il est facilement confondu avec MySQL


3 Réponses :


18
votes

Vous devez déplacer l'opérateur où ci-dessus em> la liste de projets où la colonne Rawrwnumber est créée. Utilisez une table dérivée ou un CTE:

WITH cte AS (
SELECT *, ROW_NUMBER() OVER (...) as RowNumber
       FROM ...)
SELECT * FROM cte 
WHERE RowNumber = ...   


0 commentaires

5
votes

Les fonctions de la fenêtre (dont Row_Number est la meilleure connaissance) sont remplies très tard dans la requête, bien après la clause WHERE. Par conséquent, vous devez le nidifier aussi, afin de filtrer dessus:

SELECT *
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY Date_Time DESC) AS RowNumber, *
    FROM
    ( SELECT T.A_ID, T.User_Name, T.Date_Time, T.Value,
             U.ID, U.Name, U.Field1, U.Field2,
             COUNT(U.ID) OVER () AS TotalRows
      FROM 
        TeeTable as T INNER JOIN YouTable AS U
        ON T.U_ID = U.ID
        WHERE T.Value BETWEEN 222 AND 225
    ) Numbered
)  Filtered
WHERE RowNumber BETWEEN 1 AND 5


0 commentaires

1
votes

Le problème de la requête entre en raison de la faute de l'ordre de traitement logique. Ceci est l'ordre de traitement logique spécifié dans le réseau MSDN DEV.

ordre de traitement logique de l'instruction SELECT Les étapes suivantes montrent l'ordre de traitement logique ou la commande de liaison, pour une instruction SELECT. Cette commande détermine lorsque les objets définis en une étape sont mis à la disposition des clauses des étapes ultérieures. Par exemple, si le processeur de requête peut se lier à (accès), les tables ou les vues définies dans la clause depuis, ces objets et leurs colonnes sont mis à la disposition de toutes les étapes suivantes. Inversement, comme la clause SELECT est étape 8, les alias de colonne ou les colonnes dérivées définies dans cette clause ne peuvent pas être référencées par des clauses précédentes. Cependant, ils peuvent être référencés par des clauses ultérieures telles que l'ordre par clause. Notez que l'exécution physique réelle de la déclaration est déterminée par le processeur de requête et la commande peut varier de cette liste. DE AU REJOINDRE OÙ PAR GROUPE Avec cube ou avec rouleau AYANT SÉLECTIONNER DISTINCT COMMANDÉ PAR Top

Introduisez donc la fonction de classement sous forme d'alias dans la sous-requête dans la section de la section, puis vous pourrez définir une condition sur l'alias de la section où la section suivante.

bonne chance .. !!


0 commentaires