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