Número() da linha DB2

Como utilizar o ROW_NUMBER () em que cláusula na base de dados DB2. Eu tentei abaixo mas não funcionou:

SELECT * FROM CSPAPP.LOCATIONS
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200

deu um erro: uso Inválido da função agregada ou da função OLAP.

também tentei de várias maneiras:

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
 7
Author: a_horse_with_no_name, 2014-11-28

5 answers

Não se pode referenciar um nome falso no mesmo nível em que está definido. Tem de embrulhar isto numa tabela derivada:

SELECT location
FROM (
   SELECT row_number() over(order by location) as rn, 
          location 
   FROM cspapp.locations
)   
WHERE rn < 200
 5
Author: a_horse_with_no_name, 2014-11-28 07:41:35

Eu uso algo assim ao seleccionar com base no número da linha nas iSeries DB2:

SELECT *
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
    FROM CSPAPP.LOCATIONS
    )
WHERE RRN between 100 and 200

Se só estiver interessado no campo 1, poderá atribuir um nome à selecção e referência dos Campos:

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
 4
Author: clutton, 2014-11-30 06:06:43

Só poderá tentar obter as primeiras 200 linhas em vez de numerar as linhas. Escreva a sua selecção Como normalmente faria sem o número de linha, peça o que necessitar e obtenha o primeiro X.

Seleccionar todas as colunas com "*" não é uma boa prática especialmente se tiver 600+ colunas (e isso por si só é um mau desenho da base de dados).

 2
Author: Sinisa Hajnal, 2016-03-03 09:33:36

Sem usar a função 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;
 0
Author: Md. Kamruzzaman, 2017-03-23 07:30:15

Pode referenciar um nome falso no mesmo nível em que está definido. Tem de embrulhar isto numa tabela derivada:

SELECT T1.* FROM(
       SELECT row_number() over(order by location) as rn ,L.* 
       FROM cspapp.locations L) As T1 
WHERE T1.rn < 200
Mas tens de perceber que nunca é uma boa prática. Você deve usar o nome da coluna em vez de * (L.col1).
 -1
Author: Ravindra Kumar, 2016-01-12 17:22:03