Même si SQLPro a totalement raison, (je vous invite d'ailleurs fortement à parcourir son site !), voici les détails :
1 2 3 4 5 6 7
| ;WITH
CTE_ORDER AS
(
SELECT val
, ROW_NUMBER() OVER(ORDER BY val) AS n
FROM dbo.maTable
) |
C'est une expression de table commune (Common Table Expression / CTE dans la littérature Anglaise) : il s'agit d'une vue qui n'a d'existence que pour la durée de la transaction.
Ici on lui fait ordonner les valeurs de la colonne val, en affectant un numéro de ligne (ROW_NUMBER()) suivant cet ordre (clause OVER()).
1 2 3 4
| CROSS APPLY (
SELECT MAX(n) - 1 AS max_n
FROM CTE_ORDER
) AS M |
Nous avons besoin de connaître le nombre de lignes que comprend la CTE.
Donc on recherche le MAX(n), et on l'applique (APPLY) à l'ensemble des lignes retournées par la CTE.
En fait d'utilisation de APPLY, on force SQL Server à n'effectuer qu'une seule fois ce calcul, plutôt que de l'effectuer pour chaque ligne.
WHERE O.n BETWEEN 2 AND M.max_n
Ici on prend les indices de lignes numéro 2 et MAX(n) - 1 : l'avant dernier.
Cela nous filtrera donc les valeurs de la colonne val comme vous le souhaitiez.
@++
![;)](https://www.developpez.net/forums/images/smilies/icon_wink.gif)
Partager