web-dev-qa-db-fra.com

ROW_NUMBER () dans DB2

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
11
Mandar

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
7

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
6
clutton

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).

3
Sinisa Hajnal

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;
2
Md. Kamruzzaman