2014-11-28 21 views
5

Come utilizzare ROW_NUMBER() nella clausola where nel database DB2. Ho cercato di sotto, ma non ha funzionato:ROW_NUMBER() in DB2

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

ha dato errore: Utilizzo non valido di funzione di aggregazione o la funzione OLAP.

Ho provato anche con modi followiong:

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 

risposta

4

Non è possibile fare riferimento a un alias allo stesso livello in cui è definito. È necessario per avvolgere questo in una tabella derivata:

SELECT location 
FROM (
    SELECT row_number() over(order by location) as rn, 
      location 
    FROM cspapp.locations 
) 
WHERE rn < 200 
+0

Grazie mille per la vostra soluzione, ma è parzialmente servire il mio prupose. Sto provando SELECT * FROM ( SELECT row_number() sopra (ordine per posizione) come rn, * FROM cspapp.locations ) DOVE Rn <200 Ma non funziona. Può suggerire. – Mandar

+0

"* not working *" non è un messaggio di errore DB2 valido. –

+0

oops.Spiacente. Errore: "È stato trovato un token imprevisto * che segue" per ubicazione "come rn.I Token previsti potrebbero includere: ." Non riesco a inserire tutte le colonne perché ci sono circa 600 colonne nella tabella. Quindi devo usare * per selezionare tutte le colonne in una volta. – Mandar

3

io uso qualcosa di simile al momento della selezione in base a numero di riga in iSeries DB2:

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

Se siete interessati solo nel campo 1 si può essere in grado di assegnare un nome alla selezione e fare riferimento ai campi:

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 
+0

Grazie per il tuo aiuto. Ho provato qualcosa di simile: SELECT * FROM cspapp.locations DOVE SIAMO (SELEZIONA posizione DA (SELEZIONA numero_riga() sopra (ordine per posizione) come rno, POSIZIONE DA cspapp.locations) DOVE Rno TRA 1000 E 10000). Ha funzionato. – Mandar

-1

è possibile fare riferimento un alias allo stesso livello in cui è definito. È necessario per avvolgere questo in una tabella derivata:

SELECT T1.* FROM(
     SELECT row_number() over(order by location) as rn ,L.* 
     FROM cspapp.locations L) As T1 
WHERE T1.rn < 200 

Ma si dovrebbe capire * è mai una buona pratica. È necessario utilizzare il nome della colonna anziché * (L.col1).

0

Si potrebbe provare FETCH FIRST 200 ROWS SOLO invece di row_number. Scrivi la selezione come faresti normalmente senza ROW_NUMBER, ordina quello che ti serve e FETCH FIRST x.

selezionare tutte le colonne con "*" non è una buona pratica in particolare se si hanno più di 600 colonne (e questo di per sé è una cattiva progettazione del database).

0

Senza usare la funzione 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;