Comment utiliser ROW_NUMBER () dans la clause where de la base de données DB2. J'ai essayé ci-dessous mais cela n'a pas fonctionné:
SELECT * FROM CSPAPP.LOCATIONS
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200
Cela a donné une erreur: utilisation non valide de la fonction d'agrégation ou de la fonction OLAP.
J'ai également essayé avec des moyens de suivi:
SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCATIONS
WHERE RN < 200
SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,LOCATION FROM CSPAPP.LOCATIONS
WHERE RN < 200
Vous ne pouvez pas référencer un alias au même niveau où il est défini. Vous devez envelopper cela dans une table dérivée:
SELECT location
FROM (
SELECT row_number() over(order by location) as rn,
location
FROM cspapp.locations
)
WHERE rn < 200
J'utilise quelque chose comme ça lors de la sélection en fonction du numéro de ligne dans iSeries DB2:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
FROM CSPAPP.LOCATIONS
)
WHERE RRN between 100 and 200
Si vous n'êtes intéressé que par le champ 1, vous pouvez attribuer un nom à la sélection et référencer les champs:
SELECT DATA.location
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
FROM CSPAPP.LOCATIONS
) as DATA
WHERE DATA.RRN between 100 and 200
Vous pouvez essayer FETCH FIRST 200 ROWS UNIQUEMENT au lieu de row_number. Écrivez votre sélection comme vous le feriez normalement sans ROW_NUMBER, commandez selon ce dont vous avez besoin et FETCH FIRST x.
sélectionner toutes les colonnes avec "*" n'est pas une bonne pratique en particulier si vous avez plus de 600 colonnes (et cela en soi est une mauvaise conception de la base de données).
Sans utiliser la fonction row_number ():
SELECT * FROM
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATION FETCH FIRST 200 rows only)
ORDER BY LOCATION DESC FETCH FIRST 100 rows only;
With Row number:
SELECT ROW_NUMBER() OVER(ORDER BY LOCATIONS), LOCATIONS as RNM FROM
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATIONS FETCH FIRST 200 rows only)
ORDER BY LOCATIONS DESC FETCH FIRST 100 rows only;